上面的教程都是針對(duì)主Target,也就是Demo。這個(gè)工程還有一個(gè)名為SwiftMessages的Framework,也可以熱更,下面介紹如何配置。
可以看到SwiftMessages的Mach-O Type是Dynamic Library,通過(guò)下圖方式查看得到:

這種類型的話,配置相對(duì)麻煩些。還有一種是Static Library,配置起來(lái)會(huì)簡(jiǎn)單得多。但本例改成Static Library啟動(dòng)會(huì)崩潰,所以按Dynamic Library的方式來(lái)介紹。
Step1: 修改編譯選項(xiàng)
選中SwiftMessages.xcodeproject工程,然后選擇SwiftMessages這個(gè)Target,再選擇Build Settings:

1. 在Other Linker Flags添加-sotmodule $(PRODUCT_NAME) /Users/sotsdk-1.0/libs/libsot_free.a -sotsaved $(SRCROOT)/Demo/sotsaved/$(CONFIGURATION)/$(CURRENT_ARCH) -sotconfig $(SRCROOT)/Demo/sotconfig.sh
2. 在Other C Flags以及Other Swift Flags添加-sotmodule $(PRODUCT_NAME) -sotconfig $(SRCROOT)/Demo/sotconfig.sh,意義跟上一步是一樣的,需要保持一致。經(jīng)過(guò)上面兩步,相關(guān)的編譯配置結(jié)果如下圖:
這一步跟Demo的配置差不多,區(qū)別在于有些路徑寫法不一樣,以達(dá)到復(fù)用Demo配置的目的,讀者可以仔細(xì)比較一下。

3. 需要把Target的Enable Bitcode設(shè)為No。

Step2: 鏈接C++庫(kù)
點(diǎn)擊Build Phases頁(yè)面,打開(kāi)Link Binary With Libraries頁(yè),點(diǎn)擊加號(hào),分別加入這兩,libz.tbd和libc++.tbd

Step3: 調(diào)用SDK API
因?yàn)镾wiftMessages是動(dòng)態(tài)庫(kù),所以需要在它的文件中調(diào)用SDK的熱更初始化接口。跟Demo一樣,添加OC文件,選中SwiftMessages工程,點(diǎn)擊Xcode軟件的File按鈕,接著點(diǎn)擊Add Files to "SwiftMessages.xcodeproject",如下圖所示:

選擇到SDK目錄swift-call-objc中,同時(shí)選中callsot.h和callsot.m兩個(gè)文件,勾選下面的Copy items if needed,勾選Add to targets:中的SwiftMessages target,如下圖所示:

點(diǎn)擊Add按鈕,然后可以看到項(xiàng)目中多了2個(gè)文件,分別是callsot.h,callsot.m,把callsot.h重命名為callsot_message.h,修改CallSot類名為CallSotMessage:

去到右邊面板,把文件屬性改成public:

打開(kāi)callsot.m,做相應(yīng)路徑和類名的修改:

打開(kāi)Demo-Bridging-Header.h,加入一行代碼#import "SwiftMessages/callsot_message.h":

打開(kāi)AppDelegate.swift,加入兩行代碼let sot1 = CallSotMessage()和sot1.initSot()

因?yàn)檫@時(shí)候有兩個(gè)Target都可以生成補(bǔ)丁,Demo和SwiftMessages,需要修改拷貝補(bǔ)丁的腳本,加入SwiftMessages:

Step4: 測(cè)試熱更
測(cè)試熱更的流程跟之前是一模一樣的,只是輸出的日志可能會(huì)有所區(qū)別,我們過(guò)一遍。EnableSot=1和GenerateSotShip=0熱更注入,先Clean后Build,如果去看編譯日志的Link SwiftMessages,也可以看到熱更注入的信息。
然后修改MessageView.swift的代碼,錯(cuò)誤提示的文案會(huì)加上“SOT is great”:

GenerateSotShip=1開(kāi)啟生成補(bǔ)丁模式,Clean后Build,查看Link SwiftMessages日志,有提示該函數(shù)被熱更:

接下來(lái)可以看到補(bǔ)丁拷貝腳本日志輸出的信息,這里它檢測(cè)到有兩個(gè)Target都生成了補(bǔ)丁文件,會(huì)把它們兩個(gè)合成一個(gè),拷貝到Bundle目錄下:

啟動(dòng)APP,會(huì)看到兩條加載補(bǔ)丁的日志,因?yàn)槲覀僁emo Target和SwiftMessages Target都調(diào)用了API接口:

點(diǎn)擊MESSAGE VIEW控件,可以看到錯(cuò)誤提示文案后面多了“SOT is great”,熱更成功:

Step5: 幾點(diǎn)提示
1. Dynamic Library的熱更編譯改法其實(shí)跟主Target,也就是Mach-O Type為Executable的改法是一樣,只是這里復(fù)用了主Target的一些配置,例如sotsaved目錄和sotconfig.sh的路徑。增加再多的Target也可以按同樣的改法修改它們。
2. 補(bǔ)丁拷貝腳本只需要主Target有就行了,把要熱更的sotmodule對(duì)應(yīng)的名字加上即可,條件就是sotsaved目錄必須是同一個(gè)。
3. 如果需要接入網(wǎng)站版,那么每個(gè)需要熱更的Target都需要調(diào)用API跟網(wǎng)站同步,它們的消耗是獨(dú)立計(jì)費(fèi)的。
Static Library的改法
上面說(shuō)到Dynamic Library的改法步驟比較多,而且有諸多缺點(diǎn),如果能把Framework的Mach-O Type改成Static Library是最好的。由于本例無(wú)法修改,這里簡(jiǎn)單說(shuō)一下步驟:
1. 在Other Libraian Flags添加-sotmodule $(PRODUCT_NAME) -sotsaved $(SRCROOT)/Demo/sotsaved/$(CONFIGURATION)/$(CURRENT_ARCH) -sotconfig $(SRCROOT)/Demo/sotconfig.sh?,注意是Other Libraian Flags而不是Other Linker Flags了。還有這里比Dynamic Library加的配置少一個(gè),即沒(méi)有鏈接SDK的.a庫(kù)文件了。
2. 在Other C Flags以及Other Swift Flags添加-sotmodule $(PRODUCT_NAME) -sotconfig $(SRCROOT)/Demo/sotconfig.sh,這步跟之前是一模一樣的。
3. 需要把Target的Enable Bitcode設(shè)為No。
4. 修改拷貝補(bǔ)丁的腳本,加入該Target的名字,例如本例加入SwiftMessages,跟之前也是一模一樣的:

然后就配置完了,如果是使用網(wǎng)站版,同步一次消耗,就能實(shí)現(xiàn)所有Target的熱更,修改簡(jiǎn)單,對(duì)包體影響最小。