打包 Framework 时使用 CocoaPods 引入第三方库的方法
最近需要将自己项目的公共代码打包成
Framework
来使用,但是在打包过程中遇到一个问题,就是提取的公共代码中用到了一些第三方的库,比如AFNetworking
等,怎么才能把第三方库集成进来让代码编译通过并打包成功呢,网上找了很久都没有找到一篇专门说这个的,让我走了不少坑,现在就分享一下在打包Framework
时怎样使用CocoaPods
引入第三方库。
如果你的代码中没有用到其他第三方库的话,可以转到我的另一篇文章:【iOS 开发】将自己的框架打包成 Framework 的方法
创建 Framework 工程
1. 创建打包工程
- 打开
Xcode
新建一个工程,选择Framework & Libray
选项中的Cocoa Touch Framework
,这里说一下我的Xcode
版本是8.3.2
。
- 假设我的代码中要用到
MBProgressHUD
这个第三方库(比较好演示),然后使用CocoaPods
在工程中集成MBProgressHUD
,集成方法和普通项目一模一样。
- 然后选择工程下的
TestFramework.xcworkspace
重新打开工程。
- 因为要打包所需的文件,所以这里我自己创建了一个测试类,并在里面使用了
MBProgressHUD
这个库,在实际的打包过程中,直接把需要打包的所有文件拖到该工程中即可。
2. 添加公开头文件
- 选中
Target
,选择Build Phases
-Headers
,可以看出有三个选项,分别是Public 、Private 、Project
,把需要公开给别人的.h
文件拖到Public
中,把不想公开的,即为隐藏的.h
文件拖到Project
中。
- 完成上述步骤之后,在默认生成的
.h
文件中,我的是TestFramework.h
,把所有需要暴露的.h
文件都用#import <TestFramework/PublicHeader.h>
引入,记住一定要将所有需要暴露的.h
文件都引入,也就是上面Headers
-Public
中加的所有.h
文件,不然编译后生成的.framework
在引用的时候会有警告。
3. 更改设置参数
- 选中
Target
,选择Build Settings
,在Architectures
下增加armv7s
。
- 选中
Target
,选择Build Settings
,在搜索栏搜索Mach-O Type
,将Mach-O Type
修改为Static Library
。
工程打包成 Framework
1. 真机编译所有文件
- 按照下图将编译的
Device
选择为真机 ,然后按下Command + B
开始编译,编译成功后右键Products
文件夹下的.framework
文件,点击show in Finder
。
- 打开后可以看到打包完成的真机
Framework
包。
2. 模拟器编译所有文件
- 按照下图将编译的
Device
选择为随便一个模拟器 ,然后按下Command + B
开始编译,编译成功后右键Products
文件夹下的.framework
文件,点击show in Finder
。
- 打开后可以看到打包完成的模拟器
Framework
包。
3. 将两个 Framework 合成
上面有两个 Framework
, 一个是 Debug-iphoneos(真机)
下的,一个是 Debug-iphonesimulator(模拟器)
下的,需要通过终端命令将两个 Framework
合为一个模拟器和真机都可使用的 Framework
。
- 打开终端先输入
lipo -create
,然后输入空格
。
- 接着将
Debug-iphoneos(真机)
下的TestFramework
也就是上面框出来的空白文件直接拖到终端,终端会自动显示路径。
- 然后直接将
Debug-iphonesimulator(模拟器)
下的TestFramework
也拖到终端。
- 接着输入
-output
,然后输入空格
。
- 然后输入
~/Desktop/NewTestFramework
后直接回车。
- 这时候桌面上会多一个新的文件为
NewTestFramework
,这时候将真机下的.framework
包文件复制出来,然后将NewTestFramework
重命名为TestFramework
也就是.framework
包中那个空白文件的名字,如果有.lipo
后缀就去掉,接着替换.framework
包中的那个空白文件。
- 最终替换完成后的
.framework
包就是我们最后所需要的包了,但是可以发现打包完后的.framework
包里面是没有CocoaPods
集成的第三方库的,所以在使用.framework
包时,工程中必须也要集成.framework
包中用到的第三方库,否则会找不到文件而报错。
测试打包完的 Framework
- 新建一个测试工程
TestDemo
,将打包完的TestFramework.framework
拖到工程中,测试一下刚才创建的 TestClass 类,可以看到MBProgressHUD
加载框显示出来了,测试成功。
- 上面说了,测试工程中也要集成
MBProgressHUD
,否则会报错。
转载:https://www.jianshu.com/p/6790fc295f48
问题一:
/Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products $ lipo -create Release-iphonesimulator5s/libstatic.a Release-iphonesimulator6/libstatic.a -output lib.a fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: Release-iphonesimulator5s/libstatic.a and Release-iphonesimulator6/libstatic.a have the same architectures (i386) and can't be in the same fat output file
1:因为我们合并的是Release-iphonesimulator6和Release-iphonesimulator5s之间的版本,都是模拟器的,或者都是真机的
2:清除缓存就可以
问题二:
自定义Framework 报错 Could not build module 解决方法
方法1、找到buildSetting---Allow Non-modular Includes In Framework Modules 这个值 改为YES.
方法2、选中xxx.Framework下 Headers文件夹 右键 “add file to 'Headers' ” 把Module 文件夹加进来就可以解决