1. 程式人生 > >製作Swift動態庫

製作Swift動態庫

動態庫

動態庫即動態連結庫(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。與靜態庫相反,動態庫在編譯時並不會被拷貝到目標程式中,目標程式中只會儲存指向動態庫的引用。等到程式執行時,動態庫才會被真正載入進來。動態庫的優點是,不需要拷貝到目標程式中,不會影響目標程式的體積,而且同一份庫可以被多個程式使用(因為這個原因,動態庫也被稱作共享庫)。

iOS FrameWork

在 iOS 8 之前,iOS 平臺不支援使用動態 Framework,開發者可以使用的 Framework 只有蘋果自家的 UIKit.Framework,Foundation.Framework 等,iOS 8/Xcode 6 推出之後,iOS 平臺添加了動態庫的支援

建立動態庫

開啟Xcode,Command+Shift+N建立新工程,選擇 Cocoa Touch Framework,語言選擇Swift

暴露介面

對於那些需要暴露出來,即在框架外部也能訪問使用的類、方便、變數前面需要加上關鍵字 Public

編譯動態庫

command+B編譯成功,在Products檔案下出現XXX.framework檔案

使用動態庫

如果把某個自己開發的動態庫Add在Linked Frameworks and Libraries裡,程式一啟動就會報Reason: Image Not Found,你只能把它放在Embeded Binaries

裡面才能正常使用。為什麼呢?因為加在EmbededBinaries裡面的東西其實會被複制一份到xx.app裡面(直譯就是嵌入的框架)

存在的問題:在動態庫中不能使用靜態庫

造成這個的主要原因是Swift的執行時庫(不等同於OC的runtime概念),由於Swift的ABI不穩定,靜態庫會導致最終的目標程式中包含重複的執行庫,相關可以看下最後的參考文章SwiftInFlux#static-libraries

臨時解決辦法:動態庫中有需要依賴靜態庫的swift檔案/頁面,都通過閉包的方式回撥到主工程中

CocoaPods使用Use_framework!

對於 Swift 專案,CocoaPods 提供了動態 Framework 的支援,通過 use_frameworks! 選項控制。