前言
- 我的第一次洛搀,請(qǐng)多多指教!目的是給予有需要的朋友以及方便自己日后的查閱睛竣。
iOS開發(fā)庫(kù)文件的分類
靜態(tài)庫(kù):
- 靜態(tài)庫(kù)有 .a 和 .framework 兩種形式;
- 在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中滨嘱,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù)。
動(dòng)態(tài)庫(kù):
- .dylib 和 .framework 形式浸间,后來.dylib動(dòng)態(tài)庫(kù)又被蘋果替換成.tbd的形式;
- 在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中太雨,只是在程序運(yùn)行時(shí)才被載入,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在魁蒜。
結(jié)論
- 同一個(gè)靜態(tài)庫(kù)在不同程序中使用時(shí)囊扳,每一個(gè)程序中都得導(dǎo)入一次,打包時(shí)也被打包進(jìn)去兜看,形成一個(gè)程序锥咸;
- 而動(dòng)態(tài)庫(kù)在不同程序中,打包時(shí)并沒有被打包進(jìn)去细移,只在程序運(yùn)行使用時(shí)搏予,才鏈接載入(如系統(tǒng)的框架如 UIKit、Foundation 等)弧轧,所以程序體積會(huì)小很多雪侥,但是蘋果不讓使用自己的動(dòng)態(tài)庫(kù),否則審核就無法通過(為什么不讓使用本人不是很清楚精绎,還請(qǐng)大神普及)速缨。
framework 制作過程
1. 首先新建一個(gè)項(xiàng)目,選擇 Cocoa touch Framework :
2. 然后隨便取一個(gè)名字 MyFramework_Create:
3. 然后根據(jù)不能的業(yè)務(wù)需求寫好自己的代碼代乃,這里因?yàn)槭菧y(cè)試旬牲,我隨便寫點(diǎn),新建一個(gè) Dog 類,然后公開一個(gè)方法并隨便 log 一點(diǎn)東西:
4. 工程配置:
-
4.1 選擇工程文件 > target 第一項(xiàng) > Build Setting > 搜索 linking搁吓,然后幾個(gè)需要設(shè)置的選項(xiàng)都顯現(xiàn)出來原茅,首先是 Dead Code Stripping 設(shè)置為 NO,網(wǎng)上對(duì)此項(xiàng)的解釋如下擎浴,意思是如果開啟此項(xiàng)就會(huì)對(duì)代碼中的 " dead ”员咽、" unreachable ” 的代碼過濾,不過這個(gè)開關(guān)是否關(guān)閉贮预,似乎沒有多大影響,不過為了完整還原 framework 中的代碼契讲,將此項(xiàng)關(guān)閉也未曾不可仿吞。
- The resulting executable will not include any “dead” or unreachable code.
4.2 然后將Link With Standard Libraries關(guān)閉,我想可能是為了避免重復(fù)鏈接:
-
4.3 最后將 Mach-O Type 設(shè)為 Static Library捡偏,framework 可以是動(dòng)態(tài)庫(kù)也可以是靜態(tài)庫(kù)唤冈,對(duì)于系統(tǒng)的framework 是動(dòng)態(tài)庫(kù),而用戶制作的 framework 只能是靜態(tài)庫(kù).
工程配置
5. 頭文件的設(shè)置:將需要公開的頭文件從 Project 中拖入 Public银伟,至于是否需要將私有的頭文件拖入Private你虹,我覺得直接放在 Project 中即可绘搞,若是 Private 中有頭文件,打包以后的 framework 中會(huì)多出一個(gè)Private 的文件夾包含著放入 Private 的頭文件傅物,不過我覺得如果是私有最好還是不要讓別人看到夯辖。以下有三種設(shè)置方法,設(shè)置前需要在 .h 文件導(dǎo)入:
-
5.1 在 target 下找到 Build Phases, 點(diǎn)開 Headers 看到 Project 下面的文件直接右鍵就可以看到一些選項(xiàng),選擇你所需 Public 的即可董饰。
頭文件的設(shè)置1 -
5.2 在上面的 Headers 界面的時(shí)候直接將 Project 下面的文件拖到 Public 下面即可蒿褂。
頭文件的設(shè)置2 -
5.3 選中 Dog.h 文件,在 Xcode 右邊找到 Target Memership 右下角的(注意不是 Xcode 整個(gè)界面右下角)上下箭頭卒暂,那里就有你想要的:
頭文件的設(shè)置3
6. iPhone 5 和 iPhone 5c 特殊機(jī)型架構(gòu)的支持配置
-
選中 Build Settings > Architectures > 單擊該選項(xiàng)的右邊 > other > armv7s ,即可
特殊機(jī)型架構(gòu)的支持配置1
特殊機(jī)型架構(gòu)的支持配置2
7. 編譯生成 .framework 文件
- 7.1 先選擇Generic iOS Device啄栓,按下 Command+B:Build 一下:
- 7.2 然后隨意選擇一個(gè)模擬器再次 Build 一下:
8. 合并真機(jī)與模擬器生成 .framework 文件:
- 8.1 Show in Finder 找到 Build 后的 framework
- 8.2 我們看到總共有兩個(gè)文件夾,上面是真機(jī)編譯生成的文件也祠,下面是模擬器編譯生成的文件昙楚。
- 8.3 我們?cè)?Products 同級(jí)目錄下(路徑可以任意選)新建一個(gè) 名為 MyFramework_Create 的文件夾作為輸出路徑,這里取名要與項(xiàng)目名一致诈嘿,至于為什么到后面自己會(huì)明白的堪旧。
-
8.4 使用命令行合并:lipo -create + 上面兩個(gè)文件的路徑(是指真機(jī)與模擬器MyFramework_Create.framework 目錄下的 MyFramework_Create文件) + -output + 合成后文件的輸出路徑。 最后回車即可永淌。
命令行合并 -
8.5 將生成的 MyFramework_Test.lipo 文件刪除后綴名并代替真機(jī)下的 MyFramework_Test 文件就完成了崎场。
代替MyFramework_Create
framework的測(cè)試
1. 新建名為 MyFramework_Test 的工程,注意選擇的是 Single View Application :


2. 將所需要的頭文件導(dǎo)入工程遂蛀,新建一個(gè) dog 對(duì)象谭跨,并調(diào)用 doSmothing 方法,查看控制臺(tái)的輸出李滴,現(xiàn)在已經(jīng)成功導(dǎo)入測(cè)試完成:
經(jīng)典報(bào)錯(cuò)
1. 缺少相關(guān)頭文件的路徑螃宙,在有些博客上看到說在測(cè)試之前就要導(dǎo)入 framework 的 Headers 的路徑,發(fā)現(xiàn)這不完全正確所坯,在我的經(jīng)驗(yàn)中如果 framework 中引入了第三方不導(dǎo)入會(huì)報(bào)錯(cuò)谆扎,沒有引用的就沒有報(bào)錯(cuò),所以個(gè)人認(rèn)為還是看情況芹助,如果運(yùn)行起來報(bào)錯(cuò)說找不到頭文件的話堂湖,那再做相關(guān)配置也無妨,配置方法如下:

2. 缺少相關(guān)設(shè)備架構(gòu)状土,報(bào)錯(cuò)如下:
- 2.1 庫(kù)中缺少了i386架構(gòu)的文件无蜂,這時(shí)我就比較困惑了件相,明明將模擬器生成的庫(kù)文件合并進(jìn)來了瓢宦,怎么在模擬器上編不通呢!用 lipo -info 命令查看一下参萄,果然沒有i386架構(gòu)的文件
前.png)
-
2.2 重新選擇 iPhone 5 模擬器與 iPhone 7 模擬器兩者運(yùn)行生成的 .framework 文件合并后與真機(jī)生成的 .framework 文件再次合并查看信息累驮,果然有了
架構(gòu)后 -
2.3 架構(gòu)總結(jié):
- 對(duì)于模擬器來說 4s 和5的模架構(gòu)是 i386 的32位架構(gòu)酣倾,5s 至今是 x86_64 的64位架構(gòu)舵揭。對(duì)于真機(jī)來說 3GS~4s 是 armv7 架構(gòu),5 和 5c 是 armv7s 架構(gòu)躁锡,5s 至今是 arm64 架構(gòu)午绳。
3. 將下圖中的選項(xiàng)設(shè)為 YES,導(dǎo)致其編譯時(shí)只生成當(dāng)前機(jī)器的框架稚铣,將其設(shè)置為 NO 后箱叁,發(fā)現(xiàn)用模擬器編譯后生成的 framework 同時(shí)包含 x86_64 和 i386 架構(gòu)。
4. 在項(xiàng)目中引入靜態(tài)庫(kù)后惕医,archive 的時(shí)候會(huì)出現(xiàn)錯(cuò)誤
-
解決辦法:
MacDown logo - Bitcode 是蘋果在 Xcode7 及以后推出的新功能耕漱。用于代碼的二次編譯,針對(duì) CPU 進(jìn)行優(yōu)化抬伺,編譯工作由蘋果 AppStore 后臺(tái)來完成螟够。針對(duì) iOS 是可選項(xiàng),默認(rèn)打開峡钓。watchOS 和 tvOS 是必選項(xiàng)妓笙,所以需要打開庫(kù)工程的此選項(xiàng)并加上 -fembed-bitcode 參數(shù),重新編譯能岩。