从两篇文章中得到的总结:一直到第七条是相关的SDK的创
一、创建framework项目
- 创建framework工程要选择iOS --> Cocoa Touch Framework
- 输入项目名称HawkeyeSDK也是编译生成的framework的名称。
- framework的名称也可以以后在项目中更改

创建framework.gif
二、编辑framework代码
创建完framework工程之后,就可开始在framework项目中添加要封装进framework中的代码实现。将已经写好的代码拖到framework项目的代码根目录HawkeyeSDK下。

拖入实现代码
三、配置framework
1. Build Settings 配置
Product Name: 最终编译出来的Framework文件的名称Mach_O Type: 选中static Library(静态库)Architectures:支持的CPU指令集,新增armv7s指令集来支持iPhone 5CBuild Active Architecture Only: 设置为NOBase SDK: 设置成当前Xcode最新版本iOS Deployment target:framework支持的最低iOS版本
2. Build Phases 配置
- 在
Link Binary With Libraries中添加项目的依赖库Compile Sources:framework 中包含的实现代码Copy Bundle Resources:项目中使用到的资源文件,图片,XIB文件,plist文件等 (建议将资源文件放到新建的Bundle中,下面会介绍Bundle的创建和使用)headers:将需要暴露出来的头文件添加到public分组下,需要隐藏的头文件添加到project分组下
四、创建Bundle
在封装framework时,如果使用到了图片,XIB,Html等不需要编译的资源文件的时候,将资源文件打包到Bundle中是最好的选择。下面介绍一下将资源文件打包成Bundle的两个方法
方法一
- 选中项目 -> 在Targets 中点击左下角的“+”按钮 -> macOS -> Bundle
- 输入Bundle的名称,不要与framework的名称重名(Bundle名称可以在Build settings中更改),否则会创建失败。
- 将Framework中用到的资源文件拖入到Bundle的
Copy Bundle Resources中

2017-07-19 17_54_39.gif
将资源文件拖入Bundle的Copy Bundle Resources之后,就算完成一个Bundle的基本创建。下面还要做一些别的设置
更改Bundle的名称:一般我们打包出来的Bundle都与framework名称相同,在刚开始创建Bundle的时候为了不与framework的名称冲突,Bundle的名字并不与Framework的名称相同,那么接下来可以在Bundle的Build Settings中更改Bundle名
- 在Targets中选中
HawkeyeSDKResources->Build Settings- 在搜索框中搜索
Product Name。更改Product Name后面的内容为你想要的名称- 搜索
hidpi将,COMBINE_HIDPI_IMAGES或Combine High Resolution Artwork改为NO。如果为YES,那么在最终打包的Bundle中,@2x和@3x不同分辨率的图片会被合成成tiff格式 。导致使用图片名称无法访问- 搜索
Enable Bitcode如果能搜索到这一项那么就把其值设置为NO。Bundle是不能使用Bitcode的

bundle4.jpg
将HawkeyeSDKResources target添为到HawkeyeSDK的依赖,这样在每次编译HawkeyeSDK的时候也会同时打包HawkeyeSDKResources。而不用每次添加添加资源文件的时候单独处理HawkeyeSDKResources。
- 在targets中选中
HawkeyeSDK- 选择
Build Phases- 展开
Target Dependencies- 点击 " + "
- 选中
HawkeyeSDKResources- 点击 add按钮

2017-07-21 09_27_11.gif
Bundle中的图片
方法二
bundle其实就是相当于一个后缀为.bundle的文件夹。所以,可以创建一个文件夹,然后将后缀修改为.bundle ,然后再将我们使用到的图片复制到文件夹中。
注意:包含xib文件的bundle是不能使用这种方法的。因为xib文件需要处理成nib文件才能被程序使用。有xib文件的bundle要使用第一种方法创建。
五、使用Bundle
在framework中使用bundle中的资源不能直接通过资源的名称来获取。
[UIImage imageNamed:@"logo.png"];
这种方法获取不到logo.png图片。
正确的方式是:先获取到bundle的路径,然后再将资源文件的路径拼接到bundle路径后面才能获取到资源。如下
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"HawkeyeSDK.bundle" ofType:@"bundle"];
NSString *imagePath = [bundlePath stringByAppendingString:@"/logo.png"];
UIImage *image = [UIImage imageNamed:imagePath];
六、编译项目
编译生成framework静态库之前先将framework对应的scheme中的run 的值改成 Release
编译真机项目
- 在设备列表中选中Generic Device
- 使用快捷键 CMD + B 编译项目
编译模拟器项目
- 在设备列表中选择一个模拟器
- 使用快捷键 CMD + B 编译项目
之后会看到在products 分组下的HawkeyeSDK.framework变成黑色。
选中HawkeyeSDK.framework右键,选择Open In Finder 可以看到编译好的两个bundle文件。
七、合成模拟器和真机通用的framework静态库
1. 静态库工程打开后设置工程的 scheme, 选择run->将Debug模式改成Release模式,选择Close具体步骤如下图:

修改Scheme.png

修改framework工程运行的配置.png
2. 设置好 scheme 后, 分别选择真机和模拟器进行编译(编译之前先command+shift+k进行清理编译缓存), 编译完成后, 进入 Finder, 如下图:

编译运行后打开framework所在位置.png

编译运行后生成的framework.png
最终合并的文件是这两个文件:

image.png
3. 开始合并真机和模拟器的framework,如下图:
打开终端,输入:lipo -info 真机framework文件路径,然后回车,如下图所示:

真机framework信息.png

模拟器framework信息.png
上方的两个操作中,真机framework在最后看到 armv7 arm64,说明是真机无误,如此方法测试模拟器文件,得到i386 x86_64。
接下来是合并:lipo -create 真机路径 模拟器路径 -output 真机路径
在这我是将framework合并到真机路径上,所以合并完成后需要按上面的方法对真机framework文件进行测试,还是拖入真机路径,若这时候得到的是:armv7 i386 x86_64 arm64,则代表合并成功,之后我们用真机下的framework即可。

作者:景彧_lo
链接:https://www.jianshu.com/p/a4a54d74c060
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
path1和path2分别是模拟器和真机的静态库的路径。path3是合成之后的文件的存放路径。
八、framework 的使用
-
将framework拖入到要使用framework的工程,并在项目的
Build Phases的Link Binary Resources中添加framework。 -
framework使用到的Bundle要添加到工程的
Copy Bundle Resources中。不然项目是找不到Bundle中的资源文件的,那么Bundle也就无法正常使用资源文件。 -
如果framework中使用到了Category 那么在使用framework的工程中要设置
Build Settings中的Other Link Flag为-ObjC或者-all_load -
如果framework有使用系统库,那么也要在使用framework的工程中将这些系统库添加到工程中。不然会报编译错误
本文详细介绍如何在iOS中创建并配置Cocoa Touch Framework,包括编辑代码、配置BuildSettings、创建资源Bundle、编译静态库及合成通用framework,最后讲解如何在项目中使用封装好的framework。
1469

被折叠的 条评论
为什么被折叠?



