Cocoapods 大家都用得不少,相信下面這一行都不陌生:
use_frameworks!
這一行的作用聲明是cocoapods生成的target使用framework的形式進行依賴。這里有個比較容易混淆的概念,framework并不等于動態庫,實際上framework和動態庫是兩個獨立的概念,framework也有靜態庫的,比如友盟提供的sdk,就是一個靜態的framework.
framework 的mach-o type 可以自行選擇:
屏幕快照 2019-06-19 下午8.59.58.png
cocoapods 的use_framework! 生成的依賴默認是動態庫依賴。
對于大部分場景,動態庫和靜態庫依賴對開發者來說其實區別不大,其中一個小小的區別就是,use_framework會自動生成一個copy framework的腳本。如圖:
企業微信截圖_dd76dbeb-0efc-4775-9d8e-b93c82af11e8.png
由于動態庫的代碼段并不會鏈入可執行文件,而是作為一個單獨的文件放在Framework文件夾,在app啟動的時候通過dyld加載,因此,cocoapods生成的這些動態依賴庫需要復制到相應的文件夾。其作用大概相當于這里:
屏幕快照 2019-06-19 下午9.09.48.png
這里添加的動態庫也會打進app里面。
于是問題就來了,如果我的cocoapods由于一些歷史原因,不能使用use_framework,但是又依賴了一些自定義的動態庫,這怎么處理呢?
一開始我嘗試多target 使用不同的配置,比如TargetA 用靜態依賴,TargetB用動態依賴,但是會報這個錯誤:
屏幕快照 2019-06-19 下午8.40.43.png
貌似走不通。然后到cocoapods 的github上翻一下issue,看有沒有類似的案例,然后發現一個絕望的事實:
https://github.com/CocoaPods/CocoaPods/issues/3839
屏幕快照 2019-06-19 下午9.16.27.png
屏幕快照 2019-06-19 下午9.16.34.png
官方不支持,也不打算支持。
所以,放棄混用的念頭吧,乖乖地換成全局的use_framework! , 或者自己在buildphase里自己寫copy的腳本吧。