知識(shí)普及:
什么是庫?
庫是程序代碼的集合,是共享程序代碼的一種方式
根據(jù)源代碼的公開情況,庫可以分為 2 種類型
開源庫
公開源代碼,能看到具體實(shí)現(xiàn)
比如 SDWebImage 、 AFNetworking
閉源庫
不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到具體實(shí)現(xiàn)
主要分為:靜態(tài)庫、動(dòng)態(tài)庫
靜態(tài)庫和動(dòng)態(tài)庫
靜態(tài)庫和動(dòng)態(tài)庫的存在形式
靜態(tài)庫: .a 和 .framework
動(dòng)態(tài)庫: .dylib 和 .framework
靜態(tài)庫和動(dòng)態(tài)庫在使用上的區(qū)別
靜態(tài)庫:鏈接時(shí),靜態(tài)庫會(huì)被完整地復(fù)制到可執(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)存 (右圖所示)


需要注意的是:項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫,不能被上傳到 AppStore!
制作 .a
1、新建項(xiàng)目-> 選擇 “Cocoa Touch Static Library”

2、添加庫需要包含的源代碼,將你工程里的代碼添加到打靜態(tài)庫工程里:


3、配置一下工程:

4、選擇需要暴露出來的 .h 文件, .m 文件會(huì)自動(dòng)編譯到 .a 文件中:


需要暴漏出的文件類在這里設(shè)置:

引入的網(wǎng)絡(luò)框架設(shè)置:(有些會(huì)自動(dòng)引入,有些需要手動(dòng)引入,根據(jù)編譯報(bào)錯(cuò),可以檢查。)

5、編譯前檢查一下是debug模式還是release模式,選擇release模式:
分debug和release模式:
Debug-iphoneos 文件夾里面的東西是用在真機(jī)上的
Debug-iphonesimulator 文件夾里面的東西是用在模擬器上的
如果 Scheme 是 Release 模式,生成的文件夾就以 Release 開頭


6、選擇真機(jī)設(shè)備,然后 Command+B 編譯, libSPCustomerServerse.a 文件從紅色變?yōu)楹谏?/p>
(注意建議先選擇真機(jī),這樣才會(huì)變色,如果先選擇模擬器,那么編譯通過了,但是不會(huì)由紅變黑,實(shí)際上是已經(jīng)編譯了模擬器的,只是給人一種假象,好像沒編譯一樣,還是紅色的)


7、選擇模擬器,建議選擇iPhone6以上的(選擇高級(jí)點(diǎn)的,低級(jí)的也可用,若選了低級(jí)的,高級(jí)的有可能就不適配了)然后依然 Command+B 編譯,模擬器和真機(jī)環(huán)境下用的 .a 文件是分開的。

8、合并模擬器(release-iphonesimulator)和真機(jī)(release-iphoneos)下的.a,以便支持真機(jī)和模擬器,合并后的.a大小大約是不合并的2倍左右。
show in finder

合并步驟:
舉例:1、新建文件夾:"dabao";
2、將上述的release-iphonesimulator和release-iphoneos兩個(gè)文件拷貝進(jìn)"dabao"文件夾。

3、打開終端,執(zhí)行以下操作:
一、在終端輸入:lipo ?-create
二、將release-iphonesimulator下的.a拖進(jìn)終端,輸入一個(gè)空格;
三、繼續(xù)將release-iphoneos 下.a 拖進(jìn)終端,輸入空格;
四、繼續(xù)輸入:-output ,打個(gè)空格;
五、輸入合并后的.a所要放的文件路徑(這里舉例依然放在“dabao”這個(gè)文件夾下,則我的電腦的路徑為:/Users/ntalker-zhou/Desktop/dabao/libSPCustomerServerseSDK.a),回車,在相應(yīng)的文件下即可生成一個(gè).a,該.a即是合并后的.a

4、檢查合并后的.a是不是滿足所有要求,依然在終端進(jìn)行以下操作:
一、在終端輸入:lipo ?-info ? ;
二、將合并后的.a拖進(jìn)終端 ,回車;

(注意:終端每一步記得要用空格隔開,否則會(huì)出錯(cuò)哦!)
這樣.a 就成功制作出了,只需要將暴漏的頭文件以及制作的.a放入工程,別人就可以使用你的程序了,再也不用擔(dān)心源碼暴漏或別人隨意修改你的代碼了,不過如果有圖片資源,圖片資源是不能打進(jìn).a的,需要在外面添加的哦。
(有時(shí)候?yàn)榱司幾g通過,根據(jù)需要,需要設(shè)置一下工程配置比如我需要配置xml等…
以上內(nèi)容為轉(zhuǎn)載至 哇哇卡:http://www.itdecent.cn/p/a1dc024a8a15
下面的是本人看了哇哇卡的文章添加一些個(gè)人在打包的時(shí)候碰到的一些東西,希望對(duì)大家有幫助
一、bundle的圖片的設(shè)置
?因?yàn)閳D片有2x,3x的格式,會(huì)自動(dòng)生成tiff格式的圖片,所以如果不需要生成tiff的格式,Targets -> Build Settings里搜索hidp,將屬性設(shè)成No即可。這樣的圖片編譯出來還死自己的一些格式,就不會(huì)報(bào)錯(cuò)了。
二、靜態(tài)庫和bundle 的設(shè)置都是相同的,這里在設(shè)置 IOS Deployment ?Target ?為8.0,意思是配置這個(gè)靜態(tài)庫為支持8.0以上的版本的。

三、使用自己靜態(tài)庫打包上架遇到的坑
靜態(tài)庫中的配置有

如果一個(gè)工程里面有靜態(tài)庫的引用,那么所有的靜態(tài)庫也需要打開Bitcode后重新編譯。
這一切都沒有問題,但是在“Archive”的時(shí)候就會(huì)報(bào)錯(cuò)。
這時(shí),就需要給靜態(tài)庫的工程增加一個(gè)選項(xiàng)“-fembed-bitcode”。之后就可以正常Archive了。
報(bào)錯(cuò)內(nèi)容
ld: bitcode bundle could not be generated because '/Users/liuyuning/Desktop/TestDecode/Decode/libDecode.a(Decode.o)' was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

增加“-fembed-bitcode”

另外,如果靜態(tài)庫的工程有 -Werror 的選項(xiàng),需要去掉。應(yīng)為在編譯的時(shí)候有一個(gè)警告。?clang:warning:argument unused during compilation: '-fembed-bitcode-marker'
如果不去掉就會(huì)報(bào)錯(cuò)。

設(shè)置上面的配置后再次打包,如果你認(rèn)為會(huì)成功,只是這樣想你就錯(cuò)了,還可能會(huì)碰到一個(gè)問題如下
ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/MedicineCurve.app/testImages.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."
ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/MedicineCurve.app/testImages.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."
這是第三方(你自己的靜態(tài)庫或其他第三方的)info.plist問題,點(diǎn)擊下方搜索info.plist,然后刪掉第三方plist文件里面的Executable file字段

刪除這個(gè)設(shè)置再次打包就可以上傳了,這是本人在弄自己的靜態(tài)庫上碰到的坑,希望對(duì)你有幫組。