記錄framework靜態(tài)庫制作流程
動(dòng)態(tài)庫與靜態(tài)庫的區(qū)別
靜態(tài)庫:連接時(shí)完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。
動(dòng)態(tài)庫:連接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存。
系統(tǒng)的.framework是動(dòng)態(tài)庫,我們自己建立的.framework是靜態(tài)庫。
.a與.framework的區(qū)別
- a是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件
- .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用
- .a + .h + sourceFile = .framework
如需制作.a靜態(tài)庫.a靜態(tài)庫制作教程
1.打包Framework流程
創(chuàng)建Framework項(xiàng)目。

2.添加要集成打包的類.h/.m/.a/Bundle/Framework等
3.項(xiàng)目配置
TARGETS —> Build Settings
Build Setting 搜索Mach-O Type 選中StaticLibrary (靜態(tài)庫) Xcode默認(rèn)是動(dòng)態(tài)庫。

Build Active Architecture Only 設(shè)置為NO。意思是當(dāng)前打包的.framework支持所有的設(shè)備。否則打包時(shí)只能用當(dāng)前版本的模擬器或真機(jī)運(yùn)行。

Build Setting 搜索Dead Code Stripping 設(shè)置為NO。編譯選項(xiàng)優(yōu)化,包瘦身,(可不改)。
Build Setting 搜索iOS Deployment Target 設(shè)置最低支持版本號。

注意:xcode12 模擬器編譯的架構(gòu)有arm64架構(gòu),導(dǎo)致與真機(jī)的架構(gòu)合并失敗。在build setting設(shè)置Excluded Architectures中設(shè)置模擬器的SDK去掉arm64,arm64e架構(gòu)

新iPhone X以上iPhone 11 iPhone12等支持新架構(gòu)得加一個(gè)arm64e,在Architectures里的other里手動(dòng)添加即可

TARGETS —> Build Phases 將需要呈現(xiàn)給來的頭文件,直接從Project拖到Public中。 不想呈現(xiàn)出來的.h文件不建議拖到Private中.。放在project中即可

在framework的頭文件中導(dǎo)入需要公開的頭文件

4.打包
配置完項(xiàng)目后,選擇對應(yīng)架構(gòu),編譯即可生成.framework靜態(tài)庫(發(fā)布建議設(shè)置release模式)

5.合并
可以通過添加腳本方式,但是這里只介紹手動(dòng)合并
需要注意 ,真機(jī)架構(gòu)只能運(yùn)行在真機(jī)上,在模擬器上會(huì)報(bào)錯(cuò)。模擬器架構(gòu)也一樣
如果需要支持所有設(shè)備,就需把真機(jī)和模擬器的framework合并。

分別在模擬器和真機(jī)設(shè)備下編譯,生成兩個(gè)xx.framework文件,然后將兩個(gè)文件使用命令合成一個(gè)


合并命令行
sudo lipo -create空格(真機(jī)framework文件路徑)空格(模擬器framework文件路徑)空格-output空格(自定義合成后文件存儲(chǔ)路徑)

把合并后的文件替換掉framework中的即可。
查看framework 架構(gòu)信息
lipo -info

6.制作好的framework集成使用
把制作好的framework拖入工程即可,引用頭文件即可

每次更改framework代碼,就得打包再導(dǎo)入測試項(xiàng)目中看實(shí)際效果,很麻煩且效率低。解決方案iOS開發(fā) 靜態(tài)庫關(guān)聯(lián)demo 多工程聯(lián)調(diào)