Xcode技巧系列:http://www.itdecent.cn/notebooks/7639304/latest
在編程的時候,我們經(jīng)過會遇到三個重要的東西:庫library,框架framework,包bundle。三者都是用來在多個應(yīng)用中共享代碼用的,開發(fā)者無需知道內(nèi)部實現(xiàn),只要使用暴露出來的接口即可。
1.庫
庫是最基本的共享代碼方式,包括:靜態(tài)庫.a文件,動態(tài)庫.dylib文件。
靜態(tài)庫:在應(yīng)用程序編譯的過程中由鏈接程序鏈接到target當中,如果多個target共享一個靜態(tài)庫,靜態(tài)庫都會被包含在每個target中。
動態(tài)庫:應(yīng)用程序運行時按照需求加載,動態(tài)庫代碼對于多個target來說是共享的,因此動態(tài)庫比靜態(tài)庫來說,運行速度更快。
注意:iOS只支持靜態(tài)庫,動態(tài)庫蘋果是不允許的,如果使用了動態(tài)庫,上架時很有可能被拒。
2.框架
相當于一個文件夾,包含了庫、界面構(gòu)造器、圖片、本地化字符串、媒體、頭文件之類的資源。可以理解為,框架包含了庫和包。
框架沒有嚴格意義上的靜態(tài)和動態(tài)的分別,開發(fā)者可以根據(jù)實際情況選擇是按需加載還是始終加載。
既然框架包含了庫,為什么還要用庫呢?因為庫制作簡單,當我們只是想隱藏代碼,暴露接口,庫是最好的方式??蚣艿脑挘谱鞑襟E多,不便于維護。
3.包
包是一種特殊的文件夾,在iOS里,包只能夠包含資源文件,不能運行代碼。
4.使用框架和庫
4.1使用系統(tǒng)框架
選擇target->general選項卡(或者build phases選項卡)->Linked Frameworks and Libraries(build phases中l(wèi)ink binary with libraries)->"+"->選擇相應(yīng)的框架

通過修改框架的狀態(tài),可以更改它們的編譯設(shè)置。如下圖,我可以看到框架的狀態(tài)status是Required,表示必須要有該框架,編譯的時候才能通過。我們可以修改為Optional,編譯的時候,如果需要這個框架才會編譯這個框架。

修改框架的狀態(tài),有時候是非常有用的,比如說最新的iOS10推送推出了一個新的框架,我們必須用該框架適配iOS10,我們導(dǎo)入了該框架,但是iOS10以前的手機是沒有該框架的,這會導(dǎo)致iOS10以前系統(tǒng)的手機出現(xiàn)閃退等莫名其妙的問題,我們就可以通過把該框架修改Optional,然后在代碼中判斷iOS系統(tǒng)如果是iOS10以后,然后再import該框架。
移除框架,只需要選中框架,點擊"-"即可。
4.2使用第三方靜態(tài)庫
使用第三方的.a文件步驟:
將靜態(tài)庫拖到項目中合適位置,xcode會自動添加到linked frameworks and libraries當中,如果說你發(fā)現(xiàn)沒有自動添加,手動找到添加即可。
接下來,設(shè)置靜態(tài)庫連接路徑:
target->build setting->Search Paths->Library Search Paths中添加靜態(tài)庫目錄,指向靜態(tài)庫所在位置。如果移動了靜態(tài)庫,要記得修改該路徑。

別的需要的設(shè)置,按照第三方庫的要求配置即可。
4.3使用第三方框架
第三方框架使用很簡單,只需要將.framework文件導(dǎo)入項目中,xcode會自動把框架放入對應(yīng)位置。如果是靜態(tài)庫框架,會自動添加到linked frameworks and libraries中,動態(tài)庫框架,會自動添加到embedded binaries中。如果發(fā)現(xiàn)沒有自動添加,到對應(yīng)位置,手動添加即可。
5.創(chuàng)建框架和靜態(tài)庫
5.1創(chuàng)建靜態(tài)庫
創(chuàng)建步驟:
File->New->Target或者Project(Target創(chuàng)建一個在當前項目中復(fù)用的庫,Project創(chuàng)建一個新的全局復(fù)用庫)->cocoa touch static library->輸入信息即可完成。

-
如果我們添加的是target的靜態(tài)庫,如圖所示:
屏幕快照 2017-01-08 下午12.09.22.png
項目中多出了一個Test分組和TARGETS下多出了一個Test對象。
我們將要復(fù)用的代碼放入.m文件中,接口暴露在.h文件中,可以創(chuàng)建多個.h.m文件,但是靜態(tài)庫文件只能是代碼文件。其中.h默認是靜態(tài)庫對外部的接口,外部程序通過導(dǎo)入頭文件暴露的接口來使用靜態(tài)庫。
自動創(chuàng)建的是OC的文件,雖然swift也可以,但是會比較麻煩。 -
如果是Project靜態(tài)庫則如圖所示:
屏幕快照 2017-01-08 下午12.09.12.png
接下來就是一段無聊的碼代碼時間。
我們把接口寫好,.m文件的實現(xiàn)寫好后,就可以開始配置靜態(tài)庫了。
配置靜態(tài)庫:
點擊TARGETS中的靜態(tài)庫對象,查看選項卡,如圖:

選擇build phases->copy files,copy files欄目的主要作用是配置暴露給用戶的頭文件,我們在里面配置哪些頭文件是需要暴露的。
.a文件有真機和模擬器之分,真機的只能在真機上面運行,模擬器只能在模擬器上面運行。
我們在Xcode工具欄上編譯方案里選擇靜態(tài)庫的編譯方案,如圖:

選擇編譯對象的時候,如果選了下方iOS simulators中的任意一項,則是編譯的模擬器庫,選擇device或者build only device,則編譯的是真機的庫。
選擇好后,使用Command+b或者product->build開始編譯。編譯完成后,我們在項目導(dǎo)航器的Products分組可以發(fā)現(xiàn)libTest.a由紅色變成了黑色。

選中,右鍵點擊,選擇show in finder就能看的編譯好的.a文件了,我們就可以把這個.a文件和頭文件發(fā)給別人使用了。添加該靜態(tài)庫方法上面已經(jīng)講了,就不在贅述了,要注意的一點就是.h文件要跟著.a文件一起拖入項目才能使用。
有時候我們會發(fā)現(xiàn)libTest依然是紅色的,沒有變化,此時只需要關(guān)閉xocde,重新打開,就能看的是黑色的狀態(tài)了。
我可以使用lipo命令在終端上面,將兩個.a文件合并成一個文件,這樣就沒有模擬器庫和真機庫之分了。
1.首先分別生成真機的庫文件,查看文件然后拖動到桌面
2.生成模擬器的庫文件,查看文件,然后拖動到桌面,名稱可能會重復(fù),修改一下名稱即可
3.使用終端cd到桌面
4.使用lipo命令合成兩個庫到一起:
lipo -create 模擬器庫 真機庫 -output 最終庫
lipo -create libTest.a libTestS.a -output test.a
5.使用lipo -info查看最終庫的信息
lipo -info test.a
Architectures in the fat file: test.a are: armv7 x86_64 arm64
可以看到支持arm和x86_64f,表明合成成功
5.2創(chuàng)建框架
同上,創(chuàng)建的時候選擇Cocoa Touch Framework即可。

點擊新建的框架對象,在選項卡內(nèi),選擇build phases選項卡,其中Headers欄目中,把需要公開的頭文件放入Public,私有的放入private,項目內(nèi)的放入project中。

在Build seeing->linking->mach-o type選項中,可以選擇生成的框架是包含的靜態(tài)庫還是動態(tài)庫,默認情況下是動態(tài)庫框架。
由于框架是Xcode6開始提供的新功能,所以,如果說編譯的框架是要支持iOS7(包括iOS7)以前的,那么必須選擇生成靜態(tài)庫框架,以后的,默認就行

配置好后,就可以編譯了,編譯的方式同上,框架也有真機和模擬器之分,處理方式同庫。編譯好后,通過上方介紹的導(dǎo)入方式導(dǎo)入項目即可。

