iOS如何創建和使用靜態庫

http://blog.ibireme.com/2013/09/18/create-ios-static-framework/


iOS如何創建和使用靜態庫

由 ibireme 發表於 2013/09/18

iOS裏可以用靜態鏈接庫和動態鏈接庫,但由於Appstore的政策限制,上架應用只能用蘋果提供的動態鏈接庫,第三方的庫只能做成靜態庫。這裏介紹一下靜態鏈接庫的創建方法和常見的一些問題。

 

1. 最常見的方法就是Xcode自帶的模板"Cocoa Touch Static Library"。這個很好理解,蘋果自己有一個簡單的教程,網上也有大把的說明。最終的結果就是一個.a文件和一堆.h頭文件。用起來也相對簡單:把頭文件導入,關聯.a靜態庫,就可以編譯了。

下面是一些示例:新浪微博SDK微信SDK

 

2.通過一些方法,將靜態庫打包成.framework,雖然是靜態庫,但使用表現上比較接近系統的動態庫。目前來看這種方法比第1種好一些,所以推薦用這種方法。手動創建一個靜態.framework是非常繁瑣的一件事情,詳細的過程可以看這裏或者這裏(中文)。懶人們可以用這個已經做好的模板:iOS-Universal-Framework。製作好後,用起來也就非常簡單了,把.framework拖到工程裏面就好。

下面是一些示例:百度分享SDK人人網SDK

常見問題:

1.製作出的靜態庫只能用在真機,不能用在模擬器,或者相反。

這時就需要把不同的代碼(armv7/armv7s/i386...)的代碼合併爲通用的靜態庫。如果用上面的iOS-Universal-Framework,它會自動用腳本幫你完成。

爲了在build時創建支持多架構的代碼,可以這樣設置:在Xcode裏面的Build Setting -> Valid Architectures 裏面,添加 armv7 armv7s arm64 i386 x86_64這幾個類型; Build Setting -> Build Active Architecture Only 選項設置爲NO。

構建完成後,可以運行命令 lipo -info <FILE> 來查看靜態庫實際包含的架構,正常情況下,會顯示類似這樣的提示: Architectures in the fat file: <FILE> are: armv7 armv7s arm64 i386 x86_64。

(2014-09-11 update: 傳言,從這天起提交AppStore的應用必須包含64位架構,所以提供SDK的人最好要確保庫中包含arm64架構)

 

2.靜態庫裏有Category方法,但是調用時報錯“unrecognized selector send to instance.”等。

這個算是一個官方的已知bug,詳情見蘋果文檔。簡單點說,如果你寫了一個靜態庫並且裏面有Category,那你就需要讓使用者在他們工程的編譯參數"Other Linker Flags"裏面添加 "-ObjC "選項。

另外,如果你寫了一個.m文件,並且裏面只有一個Category,這時就需要使用者添加"-all_load"來加載全部資源,或者添加"-force_load xxx"來強制加載你的庫的資源。如果這麼做會非常影響速度,爲了修復這個問題,通常的解決辦法是在這個.m文件裏寫一個空的Class來佔位。下面是一個宏定義:

 

3.添加了靜態庫後,編譯報錯"有重複定義的符號(duplicate symbol )"。

這通常是靜態庫中的某些定義和使用者的工程有衝突。由於ObjC沒有命名空間或者包管理這樣的東西,所以靜態庫的開發者一定要把靜態庫中的東西全部加上Prefix來做保護。例如,某個SDK用到了JSONKit,那就儘量把JSONKit裏面的聲明都加上前綴,例如XXXJSONDecoder。

如果你是在用到別人製作的庫時遇到這個問題,並且那人沒有提供源碼,趕緊去聯繫那人讓他改!! 我所知度廠鵝廠啊,從網什麼的都幹過這事兒(尤其是鵝廠SDK)。。

 

 

其他注意事項:發佈靜態庫時要注意選項"Release/Debug"。如果修改了靜態庫,但代碼不起作用,一定要清除各種緩存和關聯。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章