動態庫這個技術出現是蠻早的了,應用使用動態庫有方便的地方也有痛苦的地方。接觸iOS開發之後不久就奇怪的發現iOS不支持開發動態庫,當時覺得有點奇怪,不過想想可能是蘋果的安全措施。
不過在開發中,總有情況是能使用動態庫比較方便的時候,搜了幾天資料,終於搞出了一個動態庫,共享一下。
Xcode中根本就不提供生成動態庫的選項,所以我們就需要從OS X的模板來生成動態庫,不過這樣生成的內容需要做一定的修改才能使用。
1. 修改Build Setting裡面的一些配置
Base SDK——需要修改成iOS的SDK
OS X Deployment Target ——修改成Compile Default
2. 編譯,這時會報錯
Check dependencies:Target specifies product type "com.apple.product-type.library.dynamic', but there's no such product type for the 'iphoneos' platform
這是報iphoneos平台不支持這樣的產品類型,這個比較麻煩,不過我們還是可以通過修改一系列xcspec文件來規避這個問題。
這需要修改Xcode工具的一些配置來實現。具體來說:
打開Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec這個文件,搜索“com.apple.product-type.library.dynamic”這一段,然後把相關的一段copy下來,粘貼到Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulator ProductTypes.xcspec裡面
打開Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Package Types.xcspec這個文件,搜索“com.apple.package-type.mach-o-dylib”這一段,然後把相關的一段copy下來,粘貼到Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulator PackageTypes.xcspec裡面
這樣就針對simulator修改好了,為了針對真機也可以使用,對於Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications目錄下的對應文件也做這樣的處理。
3. 確保幾個編譯參數
installation Directory改成@executable_path
Mach-O Type改成dynamic library
Executable Extension改成dylib
Executable Prefix置空
Precompile Prefix Header改成No
Prefix Header置空
這時再編譯,應該就可以通過了。
我們可以在庫裡面增加方法,然後寫應用來調用庫內的方法,實踐了一下,這樣做是可行的。
對於動態庫的技術來說,蘋果實際上是支持的,不說OS X平台上可以用動態庫。就是iOS上的應用,每個也要加載幾十上百個動態庫(DYLD加載的),但我們自己做動態庫蘋果是不支持的。在這裡再啰嗦一下,如果你使用了動態庫,蘋果AppStore上的審核是通不過的,請千萬千萬注意這一點。