最近需要將自己項目的公共代碼打包成
Framework
來使用,但是在打包過程中遇到一個問題,就是提取的公共代碼中用到了一些第三方的庫,比如AFNetworking
等,怎么才能把第三方庫集成進來讓代碼編譯通過並打包成功呢,網上找了很久都沒有找到一篇專門說這個的,讓我走了不少坑,現在就分享一下在打包Framework
時怎樣使用CocoaPods
引入第三方庫。
如果你的代碼中沒有用到其他第三方庫的話,可以轉到我的另一篇文章:【iOS 開發】將自己的框架打包成 Framework 的方法
創建 Framework 工程
1. 創建打包工程
- 打開
Xcode
新建一個工程,選擇Framework & Libray
選項中的Cocoa Touch Framework
,這里說一下我的Xcode
版本是8.3.2
。

創建工程
- 假設我的代碼中要用到
MBProgressHUD
這個第三方庫(比較好演示),然后使用CocoaPods
在工程中集成MBProgressHUD
,集成方法和普通項目一模一樣。

CocoaPods
- 然后選擇工程下的
TestFramework.xcworkspace
重新打開工程。

重新打開工程
- 因為要打包所需的文件,所以這里我自己創建了一個測試類,並在里面使用了
MBProgressHUD
這個庫,在實際的打包過程中,直接把需要打包的所有文件拖到該工程中即可。

測試類
2. 添加公開頭文件
- 選中
Target
,選擇Build Phases
-Headers
,可以看出有三個選項,分別是Public 、Private 、Project
,把需要公開給別人的.h
文件拖到Public
中,把不想公開的,即為隱藏的.h
文件拖到Project
中。

Headers
- 完成上述步驟之后,在默認生成的
.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
包。

Framework
2. 模擬器編譯所有文件
- 按照下圖將編譯的
Device
選擇為隨便一個模擬器 ,然后按下Command + B
開始編譯,編譯成功后右鍵Products
文件夾下的.framework
文件,點擊show in Finder
。

編譯模擬器
- 打開后可以看到打包完成的模擬器
Framework
包。

Framework
3. 將兩個 Framework 合成
上面有兩個 Framework
, 一個是 Debug-iphoneos(真機)
下的,一個是 Debug-iphonesimulator(模擬器)
下的,需要通過終端命令將兩個 Framework
合為一個模擬器和真機都可使用的 Framework
。
- 打開終端先輸入
lipo -create
,然后輸入空格
。

Framework 合成
- 接着將
Debug-iphoneos(真機)
下的TestFramework
也就是上面框出來的空白文件直接拖到終端,終端會自動顯示路徑。

Framework 合成
- 然后直接將
Debug-iphonesimulator(模擬器)
下的TestFramework
也拖到終端。

Framework 合成
- 接着輸入
-output
,然后輸入空格
。

Framework 合成
- 然后輸入
~/Desktop/NewTestFramework
后直接回車。

Framework 合成
- 這時候桌面上會多一個新的文件為
NewTestFramework
,這時候將真機下的.framework
包文件復制出來,然后將NewTestFramework
重命名為TestFramework
也就是.framework
包中那個空白文件的名字,如果有.lipo
后綴就去掉,接着替換.framework
包中的那個空白文件。

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 文件夾加進來就可以解決