標籤:

升級 CocoaPods 1.5,使用 Swift Static Library

升級 CocoaPods 1.5,使用 Swift Static Library

來自專欄 Prelude

升級 CocoaPods 1.5,使用 Swift Static Library

CocoaPods 1.5 is amazing!

CocoaPods 1.5 在前一段時間 release 了,其中有一個對於使用了 Swift 的項目非常重要 feature,那就是支持了 Swift 的 Static Library。

這還要講講 Swift Static Library 的歷史。在 Xcode 9 之前,並不支持 Swift Static Library;Xcode 9 之後支持了 Swift 的 Static Library,但是使用 Swift + CocoaPods 的項目並沒有辦法使用 Static Library,因為 CocoaPods 不支持。在 CocoaPods release 1.4 版本 的時候,終於支持了在 use_framework! 的情況下使用 Static Library,但是對於 Swift 和 Objective-C 混編的項目還是未能完美支持;終於在 1.5 版本,Swift 的項目能用上 Static Library 了!

為什麼這件事情令人興奮呢?這還得從 Dynamic Library 說起。Apple 官方推薦每個 App 使用 Dynamic Library 的數量是 6 個,這是有原因的。因為在 App 啟動的時候,dyld 會load 這些動態庫,這會造成啟動時間的增加;而且動態庫數量過多,還會在 iOS 9 的設備上造成 dyld 的 crash。所以使用 Static Library 應該是每個使用了 Swift + CocoaPods 的項目都期望的事情。

在 CocoaPods 還未支持這件事情的時候,可以使用 cocoapods-amimono 這個插件。它會把所有 Dynamic Library 的符號拷貝到最終程序的可執行文件中,解決上面出現的兩個問題。

既然使用動態庫有這樣那樣的問題,那在升級了 1.5 以後,全都使用靜態庫不就好了?事是這麼回事,但使用靜態庫也不是完美的,因為你還可能會遇到這樣的問題:兩個 Framework 中如果定義了相同名字的 C 函數會發生什麼? ,調用 category 方法會 crash 等等,不過都比較好解決,不像 Dynamic Library 那樣有硬傷。

總體上來說,使用靜態庫還是比動態庫有優勢的。

然而要想在項目中使用這個 feature,需要在 podspec 顯示指定 s.static_framework = true,對於集成 100 多個 pod 的項目來說,一個個改起來太麻煩了,也不現實。但是 CocoaPods 是 Ruby 寫的呀,我們可以通過 patch CocoaPods 來實現在只寫幾行代碼的情況下,把所有 pod 變成 Static Framework,

在 Podfile 的同級目錄創建 patch_static_framework.rb

module Pod class PodTarget def static_framework? return true end endend

在 Podfile 的最上面,引入該文件,

require_relative patch_static_framework

這樣對於 PodTarget 的 patch 就會在 pod install 的時候生效,所以我們就不需要改每個 pod 的 podspec 就可以實現每個 pod 都是 static_framework 的效果了


推薦閱讀:

TAG:iOS | iOS開發 |