如果我們有些功能要給別人用,但是又不想公開源代碼,比如百度地圖等,這時候我們就可以打包成庫供別人使用。
庫分靜態(tài)庫和動態(tài)庫兩種:
靜態(tài)庫:以.a 和 .framework為文件后綴名。
動態(tài)庫:以.tbd(之前叫.dylib) 和 .framework 為文件后綴名。
靜態(tài)庫與動態(tài)庫的區(qū)別
靜態(tài)庫:鏈接時會被完整的復制到可執(zhí)行文件中,被多次使用就有多份拷貝。
動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內存,系統(tǒng)只加載一次,多個程序共用(如系統(tǒng)的UIKit.framework等),節(jié)省內存。
蘋果規(guī)定不讓使用自己的動態(tài)庫,否則審核就無法通過。
但是現(xiàn)實中集成了動態(tài)庫也能上線審核通過,可能我比較幸運。
我們先來看一下iOS設備有哪些架構,因為下面要用到:
模擬器:
iPhone4s-iPnone5:i386
iPhone5s-iPhone7 Plus:x86_64
真機:
iPhone3gs-iPhone4s:armv7
iPhone5-iPhone5c:armv7s
iPhone5s-iPhone7 Plus:arm64
支持armv7的靜態(tài)庫可以在armv7s上正常運行。
一、 .a靜態(tài)庫的制作
-
1、先創(chuàng)建一個新的Xcode工程TestStaticLibrary,需要選擇Cocoa Touch Static Library這個模板:選擇Cocoa Touch Static Library
2、創(chuàng)建完成后刪除TestStaticLibrary.h和TestStaticLibrary.m兩個沒有用的文件
-
3、新建文件或者從其它項目中拖入想要打包的文件,這里拖入SmartCLLocationManager.h和SmartCLLocationManager.m兩個文件SmartCLLocationManager.h

-
3、選擇添加公開頭文件
為了讓使用者知道有哪些方法可以用,我們需要公開頭文件,這里我們公開SmartCLLocationManager.h:
添加公開頭文件.gif -
4、修改配置
我們需要把Build Active Architecture Only修改為NO,否則生成的靜態(tài)庫就只支持當前選擇設備的架構。修改配置 -
5、然后編譯
我們在debug和Release下分別選擇Generic iOS Device和任意一個模擬器各編譯一次,編譯完后我們會看到工程中Products文件夾下的libTestStaticLibrary.a由紅色變成了黑色,然后show in finder,看看生成的文件:
編譯生成靜態(tài)庫
我們看到它為真機和模擬器都生成了debug 和Release版本的.a靜態(tài)庫。里面都包含我們選擇公開的頭文件。
我們來看看靜態(tài)庫支持的框架:命令為lipo -info 靜態(tài)庫名字

我們看到,Debug-iphoneos里面的靜態(tài)庫支持的架構有armv7和arm64所以它只能用于真機,在模擬器上會報錯。Debug-iphonesimulator里面的靜態(tài)庫支持的架構有i386和x86_64,所以它只能用于模擬器,在真機上會報錯。
如果想要讓模擬器和真機通用一個靜態(tài)庫,我們可以使用終端命令來實現(xiàn)。命令格式:lipo -create 第一個.a文件的絕對路徑 第二個.a文件的絕對路徑 -output 最終的.a文件路徑:
未完待續(xù)。
首推:record,就是上傳時候有點慢。以下鏈接拿好不寫。親測好用。




