需求
- 有一個(gè)工程
test.project
,接入了自寫(xiě)的SDKSDK.framework
,SDK.framework
里同時(shí)有引用另外自寫(xiě)的other.framework
洁墙,每次都要一一添加吸重,于是想把other.framework
融合進(jìn)SDK.framework
蚕涤,以后只需要添加一次就好了淹父。
思路
思路1
-
SDK.framework
和other.framework
,進(jìn)行多工程聯(lián)調(diào)蹲盘。把other.framework
當(dāng)作SDK.framework
的子靜態(tài)庫(kù)股毫,拿到重新封裝后
的SDK.framework
給工程test.project
用。如圖-1:- 結(jié)果:
- 直接運(yùn)行
test.project
召衔,報(bào)錯(cuò)铃诬。 - 把
other.framework
也導(dǎo)入test.project
中,運(yùn)行成功苍凛。如圖-2: -
test.project
的products
文件夾趣席,右鍵show in finder
,發(fā)現(xiàn)SDK.framwork
和other.framework
并沒(méi)有融合毫深。如圖-3:
- 直接運(yùn)行
- 結(jié)論:這只是在
SDK.framework
中引用other.framework
聯(lián)調(diào)的常規(guī)操作,并沒(méi)有融合毒姨,需要在工程test.project
中導(dǎo)入other.framework
才能正確運(yùn)行哑蔫,與需求
不符。
圖-1
圖-2
圖-3
- 結(jié)果:
思路2
- 把
other.framework
變成other.a
弧呐,把other.a
融合進(jìn)SDK.framework
中闸迷,再把重新封裝后
的SDK.framework
給工程test.project
用。如圖-4:- 結(jié)果:
- 工程
test.project
只導(dǎo)入SDK.framework
俘枫,運(yùn)行成功腥沽! -
test.project
的products
文件夾下,用命令class-dump
導(dǎo)出test.app
的.h
鸠蚪,發(fā)現(xiàn)靜態(tài)庫(kù)other.a
頭文件也在里面今阳,SDK.framework
的確融合了other.a
师溅。如圖-5:
- 工程
- 結(jié)論: 靜態(tài)庫(kù)
other.a
完全融合進(jìn)SDK.framework
。符合需求
盾舌。
圖-4
- 結(jié)果:
如何把 . framework變成 . a
情況1
-
other.framework
直接修改成other.a
墓臭。步驟:-
framework
只是個(gè)文件夾,打開(kāi)other.framework
妖谴,找到同名的
/無(wú)后綴的
文件other
窿锉,直接改名->other.a
,選擇添加該擴(kuò)展名到文件末尾,拖到SDK.framework
中引用膝舅。 - 打開(kāi)
other.framework
嗡载,找到Headers
文件夾,拖到SDK.framework
中引用仍稀。 - 融合洼滚,編譯后的
SDK.framework
拖到test.project
中引用 - 運(yùn)行
test.project
,完成琳轿。
-
情況2
-
other.framework
和SDK.framework
都是自己寫(xiě)的判沟。會(huì)出現(xiàn)以下幾種情況比較麻煩:- 每次修改
other.framework
后,要手動(dòng)按照情況1
,把other.framework
->other.a
,進(jìn)行融合崭篡,太麻煩挪哄。 - 把
other.framework
和SDK.framework
進(jìn)行聯(lián)調(diào),是可以實(shí)時(shí)得到最新的other.framework
,隨時(shí)聯(lián)調(diào)琉闪。但是這種方式迹炼,test.project
需要同時(shí)拖入other.framework
和SDK.framework
,這樣又不是本文的需求
颠毙。
- 每次修改
- 思路:
-
.framwork
和.a
都是靜態(tài)庫(kù)斯入,本質(zhì)上是一回事。 - 上面
情況1
蛀蜜,說(shuō)明添加一下后綴就能實(shí)現(xiàn).framework
->.a
刻两。反過(guò)來(lái)去掉后綴,就變成了framework
中的二進(jìn)制文件滴某。
-
- 猜測(cè):
- 那么我們建立一個(gè)靜態(tài)庫(kù)工程應(yīng)該可以同時(shí)得到
.framework
和.a
兩種不同后綴的靜態(tài)庫(kù)磅摹。(如圖-5):
圖-5
- 那么我們建立一個(gè)靜態(tài)庫(kù)工程應(yīng)該可以同時(shí)得到
- 實(shí)踐:
- 按照建立一個(gè)
framework
靜態(tài)庫(kù)的方法,建立一個(gè)叫other.framework
的工程霎奢,工程自動(dòng)生成一個(gè)target
--->other
户誓。 - 在工程上,新添加一個(gè)
target
叫libtest
幕侠。如圖-6/圖-7: - 運(yùn)行靜態(tài)庫(kù)工程帝美,成功,得到靜態(tài)庫(kù)
liblibtest.a
晤硕。如圖-8: -
show in finder
悼潭,發(fā)現(xiàn)不僅有other.framework
,而且libtest.a
和頭文件
還是齊全的庇忌。 - 按照常規(guī)導(dǎo)入
.a
靜態(tài)庫(kù)方法,把libtest.a
靜態(tài)庫(kù)導(dǎo)入SDK.framework
,聯(lián)調(diào)成功女责! -
情況2
完成漆枚。
圖-6
圖-7
圖-8
- 按照建立一個(gè)
細(xì)節(jié)修改
- 按照常規(guī)靜態(tài)庫(kù)工程方法,target
libtest
->Build Phases
->Headers
/Copy Fiels
抵知,選擇暴露libtest
的.h
文件 - 按照常規(guī)靜態(tài)庫(kù)工程方法墙基,target
libtest
->Build Phases
->Compile Sources
,選擇libtest
參與編譯的.m
文件 - 設(shè)置target
libtest
刷喜,最高支持的iOS
版本:targetlibtest
->Build Settings
->Deployment
->iOS Deployment Target
->iOS10.xxx
- 設(shè)置target
libtest
残制,最高支持的iOS
版本:targetlibtest
->Build Settings
->Deployment
->iOS Deployment Target
->iOS10.xxx
- 設(shè)置target
libtest
頭文件輸出路徑:targetlibtest
->Build Settings
->Packaging
->Public Headers Folder Path
->$(CONTENTS_FOLDER_PATH)/Headers
- 設(shè)置target
libtest
的名字:targetlibtest
->Build Settings
->Packaging
->Product Name
->隨便取名
- 取消target
libtest
自動(dòng)在名字前加上lib
:targetlibtest
->Build Settings
->Executable Prefix
->刪掉lib
- 新建一個(gè)target
libtest
,配置好.h
/.m
后,運(yùn)行報(bào)錯(cuò)掖疮,發(fā)現(xiàn)主頭文件other.h
中的#import<other/aaa.h>
/#import<other/bbb.h>
都找不到初茶,解決辦法:- 設(shè)置一個(gè)宏定義,當(dāng)前是編譯
other.framework
時(shí)浊闪,主頭文件other.h
加載:#import <other/aaa.h> #import <other/bbb.h>
- 設(shè)置一個(gè)宏定義恼布,當(dāng)前是編譯
libtest.a
時(shí),主頭文件other.h
加載:#import <aaa.h> #import <bbb.h>
- 設(shè)置target
libtest
:targetlibtest
->Build Settings
->Apple Clang-Preprocessing
->Preprocessor Macros
->Debug
和Release
->FWMK=0
- 設(shè)置target
other
:targetother
->Build Settings
->Apple Clang-Preprocessing
->Preprocessor Macros
->Debug
和Release
->FWMK=1
- 主頭文件
other.h
的代碼修改為:#if FMWK #import <other/aaa.h> #import <other/bbb.h> #else #import <aaa.h> #import <bbb.h> #endif
- 利用
lipo
對(duì)不同arm
的.a
合并搁宾。
- 設(shè)置一個(gè)宏定義,當(dāng)前是編譯