最近需要將自己項目的公共代碼打包成
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 文件夾加進來就可以解決
