? ? ? ? 在iOS項目開發(fā)的過程中,為了保護(hù)源碼不被別人看到,一般選擇將私密內(nèi)容打包成靜態(tài)庫,別人只能調(diào)用接口,而不能知道其中實現(xiàn)的細(xì)節(jié)。靜態(tài)庫分為真機—Debug(調(diào)試)版本、真機—Release(發(fā)布)版本、模擬器—Debug版本、模擬器—Release版本;開發(fā)中一般都打包Release(發(fā)布)版本,將真機和模擬器版本合并,提供別人使用。
? ? ? ?關(guān)于如何制作單個靜態(tài)庫網(wǎng)上已經(jīng)有很多優(yōu)秀的文章進(jìn)行過詳細(xì)的說明,但是如果我們使用的靜態(tài)庫之間有依賴關(guān)系或者需要將靜態(tài)庫進(jìn)行統(tǒng)一管理,該如何處理呢? 在這里跟大家分享的是在制作靜態(tài)庫過程中經(jīng)常用到的的XCode基本配置說明,并介紹通過這些配置來實現(xiàn)自定義的靜態(tài)庫輸出路徑,從而實現(xiàn)多個靜態(tài)庫的統(tǒng)一管理。
? ? ? ?一.首先介紹xcode build settings一些重要配置參數(shù)。
Valid Architectures:有效的arm指令集,ARM是微處理器行業(yè)的一家知名企業(yè),arm處理器以體積小和高性能的優(yōu)勢在嵌入式設(shè)備中廣泛使用,幾乎所有手機都是使用它的?,F(xiàn)有的指令集有i386,x86_64,armv7,armv7s,arm64,他們和真機的對應(yīng)關(guān)系如下:
模擬器:iphone4s-5 : i386 iphone5s-6plus : x86_64
真機:iphone3gs-4s : armv7 ?iphone5-5c : armv7s (靜態(tài)庫只要支持了armv7,就可以跑在armv7s的架構(gòu)上) iphone5s-6plus : arm64
armv6, armv7, armv7s是ARM CPU的不同指令集,原則是向下兼容的。例如iPhone4S CPU支持armv7, 但它同時兼容armv6,只是使用armv6指令可能無法充分發(fā)揮它的特性。
Build Products Path:靜態(tài)庫最后產(chǎn)生.a文件存放路徑。
Intermediate Build Files Path:主要是編譯中產(chǎn)生的一些文件。
Other Linker flag:XCode的鏈接器參數(shù),如:-ObjC -all_load -force_load等。
Private Headers Folder Path:私有頭文件的路徑。
Public Headers Folder Path:對外公開頭文件路徑。外部工程在使用該.a庫時,需要導(dǎo)入該路徑下的頭文件。
Header Search Paths:依賴的外部頭文件搜索路徑。
User-Defined:在該區(qū)域里用戶可以自定義一些變量。
Prefix Header: 預(yù)編頭文件(比如:FireflyUI/FireflyUI -Prefix.pch)
Precompile Prefix Header:設(shè)為“Yes”,表示允許加入預(yù)編譯頭。
XCode自帶的環(huán)境變量:
$(TARGET_NAME):工程名字;
$(SRCROOT):工程(比如Firefly.xcodeproj))路徑;
$(CURRENT_PROJECT_VERSION):當(dāng)前版本號;
$(BUILD_DIR):靜態(tài)庫最終Products的路徑;
? ? ? 二.自定義靜態(tài)庫輸出路徑
先看下最終實現(xiàn)效果,將自定義的靜態(tài)庫源代碼放在同一個路徑下:


如上圖所示,F(xiàn)ireflyCore,FireflyNetWork,FireflyUI分別為靜態(tài)庫工程,最后生成的.a以及頭文件路徑如下圖所示,這是最后的實現(xiàn)效果:

實現(xiàn)方法如下:
1.在User-Defined區(qū)域自定義兩個變量:

? ? ?BUILD_ROOT_PATH: ? $(SRCROOT)/../.. ? ? ? 表示工程所在目錄的上兩級目錄,即src同級目錄
? ? ?HEADER_ROOT_PATH: ?/../includeHeaders ?表示引用頭文件路徑
2.設(shè)置.a文件生成路徑
? ?設(shè)置Build Products Path 值為:$(BUILD_ROOT_PATH)/build/Products
? ?設(shè)置Intermediate Build Files Path值為:$(BUILD_ROOT_PATH)/build/
3.設(shè)置Public Headers Folder Path 值為:$(HEADER_ROOT_PATH)/$(TARGET_NAME)
4.設(shè)置Other Linker Flag值為 all_load
5.設(shè)置Header Search Path值為:$(BUILD_DIR)/includeHeaders 和$(inherited)
6.設(shè)置Prefix Header值為:$(SRCROOT)/$(TARGET_NAME)/$(TARGET_NAME)_Prefix.pch
7.配置好這些Build Settings后,直接運行工程即可生成對應(yīng)的靜態(tài)庫。
關(guān)于靜態(tài)庫中的Build Phases中的相關(guān)配置這里就不再詳細(xì)說明了,以及怎樣將只支持模擬器的.a和支持真機的.a文件進(jìn)行合并,網(wǎng)上有很多教程可供參考。