xcode9制作framework
一、什么是库?
库是共享程序代码的方式,一般分为静态库和动态库。
存在形式:
静态库:.a .framework
动态库:.dylib .framework
区别:
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
(注意:项目中如果使用了自制的动态库,原则上是不能被上传到AppStore!)
二、framework的制作
1、创建CocoaTouchFramework项目,如图
创建framework项目2、新建bundle用来存放xib和图片资源(注意名字不能和静态库重复)
File -> New -> Target ,因为iOS没有这一项,所以需要选择macOS,然后搜索bundle
新增bundle的target3、最终得到的工程结构如图:
工程结构4、设置framework为静态库(因为xcode默认值为动态库)
注意图中左侧选择的是黄色小箱子,然后在build-setting中搜索mach,将设置项更改为static library。默认是Dynamic library
设置静态库选项5、设置新建bundle为IOS同时关闭bitcode (根据需要设置)
刚才新建的bundle是针对macOS的,所以需要我们手动修改BaseSDK,如图,默认是macOS
6、代码中引用xib或者图片
7、xib和图片放入bundle中
8、设置Bundle的COMBINE_HIDPQ_IMAGES为NO
否则bundle中的png图片经过编译打包会变成tiff的文件,进而导致对应图片找不到
9、设置暴露的头文件
将需要暴露出来的.h文件从project中拖到Public中
10、生成静态库framework和bundle文件
分别选中左下角图中静态库和bundle文件,然后run,然后open in finder,就会得到两个文件,然后将两个文件拖入
10、查看所有build的产品
选中Products中framework或者bundle文件,在finder中打开文件,查看简介获取到文件路径信息,跳转到文件上级目录,可以查看到各种模式下的文件目录:
三、注意事项和扩展知识点
1、合并并生成真机和模拟器通用的framework文件
通过上面方式,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的。但是可以通过lipo命令来合并生成通用的framework文件,从而解决这个问题。
1.1、手动通过lipo命令合并:
以Release的情况,找到build出来的Products目录,分别将Release-iphoneos和Release-iphonesimulator文件夹中的framework中的程序文件拷贝出来单独放到一个文件夹中,通过 lipo -create ** ** -output ** 生成和并的文件,将合并后的文件覆盖之前任何一个framework目录下的文件,这样就可以得到通用的framework了。
1.2、设置shell脚本
target -> build pharse -> run scripts 添加以下代码
if [ "${ACTION}" = "build" ]thenINSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.frameworkDEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.frameworkSIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.frameworkif [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fimkdir -p "${INSTALL_DIR}"cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"#open "${DEVICE_DIR}"#open "${SRCROOT}/Products"fi
2 、lipo
lipo是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件。
lipo -info xxxx.framework/xxxx或/xxxx.a
查看信息,支持的cpu架构列表
lipo -create xxxx xxxx -output xxxx
整合成Fat文件
lipo xxxx -thin cpu(armv7/arm64等) -output xxxx
提取特定的cpu架构的thin文件
lipo -remove cpu(armv7/arm64等) xxxx -output xxxx
移除掉特定的cpu架构的文件
3、了解bitcode
LLVM是目前苹果采用的编译器工具链,Bitcode是LLVM编译器的中间代码的一种编码,LLVM的前端可以理解为C/C++/OC/Swift等编程语言,LLVM的后端可以理解为各个芯片平台上的汇编指令或者可执行机器指令数据,那么,BitCode就是位于这两者直接的中间码. LLVM的编译工作原理是前端负责把项目程序源代码翻译成Bitcode中间码,然后再根据不同目标机器芯片平台转换为相应的汇编指令以及翻译为机器码.这样设计就可以让LLVM成为了一个编译器架构,可以轻而易举的在LLVM架构之上发明新的语言(前端),以及在LLVM架构下面支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不能在任何平台上运行,但是它可以转化为任何被支持的CPU架构,包括现在还没被发明的CPU架构,也就是说现在打开Bitcode功能提交一个App到应用商店,以后如果苹果新出了一款手机并CPU也是全新设计的,在苹果后台服务器一样可以从这个App的Bitcode开始编译转化为新CPU上的可执行程序,可供新手机用户下载运行这个App.
可以阅读以下文章具体了解一下: