在 Xcode 9 之前低飒,不支持 Swift 靜態(tài)庫(kù)編譯,因此 Swift pod 不得不使用動(dòng)態(tài)庫(kù)編譯懂盐,即使用?use_frameworks!褥赊。但是,引用了大量動(dòng)態(tài)庫(kù)會(huì)導(dǎo)致應(yīng)用程序啟動(dòng)時(shí)間變長(zhǎng)莉恼。
好在 Xcode 9 之后開(kāi)始支持 Swift 靜態(tài)庫(kù)編譯拌喉。為了充分利用該特性,從 CocoaPods 1.5.0 開(kāi)始俐银,對(duì)于 Swift pod尿背,開(kāi)發(fā)者不用必須在 Podfile 中指定?user_frameworks!?以強(qiáng)制使用動(dòng)態(tài)庫(kù)編譯。不過(guò)捶惜,要注意的是田藐,如果一個(gè) Swift pod 依賴(lài)了一個(gè) OC pod,那么要為對(duì)應(yīng)的 OC pod 開(kāi)啟?modular headers(use_modular_headers!?就會(huì)開(kāi)啟?modular headers)吱七。那么汽久,Swift 引用 OC 時(shí)為什么要開(kāi)啟?modular headers?事實(shí)上踊餐,開(kāi)啟?modular headers?的本質(zhì)就是將 pod 轉(zhuǎn)換為 Modular(也就是支持模塊)景醇,而 Modular 是可以直接在 Swift 中 import 的,不需要再經(jīng)過(guò) bridging-header 進(jìn)行橋接吝岭,從而簡(jiǎn)化了 Swift 引用 OC 的方式三痰。
只有支持了模塊的框架,才能支持通過(guò)模塊化頭文件(Modular Header)的方式進(jìn)行導(dǎo)入苍碟。Clang 支持模塊編譯酒觅,能夠加速編譯,減少出錯(cuò)微峰。我們可以通過(guò)添加 modulemap 文件使框架支持模塊舷丹。
簡(jiǎn)化 Swift 引用 OC 的方式是使用?use_modular_headers!?的一個(gè)原因,除此之外蜓肆,use_modular_headers!?還能夠解決一個(gè)歷史原因颜凯。
在 CocoaPods 誕生之初谋币,其致力于封裝盡可能多的第三方庫(kù)。為此症概,CocoaPods 使用了較為寬松的頭文件搜索路徑(Header Search Paths)蕾额,允許 pod 之間的相互引用,無(wú)需考慮命名空間彼城,不必采用?#import <NameSpace/fileName.h>?的模塊導(dǎo)入方式诅蝶,允許采用?#import "fileName.h"?的導(dǎo)入方式。
但是募壕,如果給 pod 添加 module map 使其支持模塊化调炬,會(huì)導(dǎo)致?#import "fileName.h"?無(wú)法正常導(dǎo)入。使用?use_modular_headers!?可以強(qiáng)制使用更優(yōu)的模塊導(dǎo)入方式舱馅。
在 CocoaPods 1.5.0 中缰泡,為了使用模塊導(dǎo)入方式。對(duì)于 pod 開(kāi)發(fā)者代嗤,可以在?pod_target_xxconfig?內(nèi)設(shè)置?'DEFINES_MODULE' => 'YES'棘钞。對(duì)于 pod 使用者,可以在?Podfile?中添加?use_modular_headers!?指定采用模塊導(dǎo)入的方式干毅,也可以通過(guò)?:modular_headers => true?配置只讓特定的 pod 采用模塊導(dǎo)入的方式宜猜。