1.新建Cocoa Touch Framework工程
2.创建或导入你要打包的类
3.配置framework最低支持的版本
4.配置Build Phases
在TARGETS -> Build Phases -> Headers中,设置framework中的哪些类是公开的,哪些类是私有。
5.配置TARGETS -> Build Settings
1>在TARGETS -> Build Settings -> Mach-O Type中设置输入文件的类型。
Mach-O文件类型分为以下五个,整好对应上面图片中的五个选项:
Executable:应用的主要二进制。
Dynamic Library:动态链接库。
Static Library:静态链接库。
Bundle:不能被链接的tbd或Dylib,只能在运行时使用dlopen()加载,可当做macOS的插件。
Relocatable Object File:可重定向文件类型。
设置为Dynamic Library的framework,需要注意一点。自己编译的动态库和系统动态库在本质上是一样的,只是使用方式不一样。自己编译的动态库由于签名校验限制,只能当作静态库一样使用;系统的动态库不受签名校验限制,可以动态加载。
关于iOS中的静态库和动态库的区别可以阅读,iOS中的静态库和动态库。
2>在TARGETS -> Build Settings ->Build Active Architecture Only中设置为NO。那么当前打包的framework支持所有的设备;否则设置为YES的话,打包时只能用当前版本的模拟器或真机运行。
3>在TARGETS -> Build Settings -> Dead Code Stripping设置为NO。
现在你需要改变一些其他的设置,尤其是那些在二进制库中遗留下的设置,编译器提供给你一个选项,来消除永远不会被执行的代码和debug符号。因为你正在创建framework供他人使用,最好禁掉这些无效代码和debug符号,让用户自己选择对自己的项目有利的部分使用。
4>在TARGETS -> Build Settings -> Strip Debug Symbol During Copy设置为NO。
5>在TARGETS -> Build Settings -> Strip Style设置为Non-Global Symbols。
6.Scheme设置为release模式
7.进行编译
使用 Shift + Command + I 进行 Profiling 编译,然后选择真机或者Generic iOS Device记性一次编译。这样才能生成两个framework,一个是Release-iphoneos的,一个是Release-iphonesimulator的,他们针对的指令集架构不同。
这里有个问题,不要使用Command + B进行编译,因为这样我们得到的会是一个 Debug 版本的结果,在绝大多数情况下这应该不是我们想要的,除非你是需要用来进行调试。
如果你对指令集架构不了解,可以查看Architectures与指令集架构armv6,armv7,armv7s,arm64,i386,x86_64这篇博客。
8.真机版本和模拟器版本framework合并
1>通过终端,使用命令行 lipo -info 查看framework架构信息。
Release-iphonesimulator:
Release-iphoneos:
2>通过终端,合并framework。
命令:$ sudo lipo -create [输入路径1] [输入路径2] -output [输出路径]
3>通过终端,查看合并后的framework架构信息。
如果信息包含模拟器和真机的指令集架构就可以了,如下图:
9.这个framework就可以被集成使用了。