上面的教程都是针对主Target,也就是Demo。这个工程还有一个名为SwiftMessages的Framework,也可以热更,下面介绍如何配置。
可以看到SwiftMessages的Mach-O Type是Dynamic Library,通过下图方式查看得到:
这种类型的话,配置相对麻烦些。还有一种是Static Library,配置起来会简单得多。但本例改成Static Library启动会崩溃,所以按Dynamic Library的方式来介绍。
Step1: 修改编译选项
选中SwiftMessages.xcodeproject工程,然后选择SwiftMessages这个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,意义跟上一步是一样的,需要保持一致。经过上面两步,相关的编译配置结果如下图:
这一步跟Demo的配置差不多,区别在于有些路径写法不一样,以达到复用Demo配置的目的,读者可以仔细比较一下。
3. 需要把Target的Enable Bitcode设为No。
Step2: 链接C++库
点击Build Phases页面,打开Link Binary With Libraries页,点击加号,分别加入这两,libz.tbd和libc++.tbd
Step3: 调用SDK API
因为SwiftMessages是动态库,所以需要在它的文件中调用SDK的热更初始化接口。跟Demo一样,添加OC文件,选中SwiftMessages工程,点击Xcode软件的File按钮,接着点击Add Files to "SwiftMessages.xcodeproject",如下图所示:
选择到SDK目录swift-call-objc中,同时选中callsot.h和callsot.m两个文件,勾选下面的Copy items if needed,勾选Add to targets:中的SwiftMessages target,如下图所示:
点击Add按钮,然后可以看到项目中多了2个文件,分别是callsot.h,callsot.m,把callsot.h重命名为callsot_message.h,修改CallSot类名为CallSotMessage:
去到右边面板,把文件属性改成public:
打开callsot.m,做相应路径和类名的修改:
打开Demo-Bridging-Header.h,加入一行代码#import "SwiftMessages/callsot_message.h":
打开AppDelegate.swift,加入两行代码let sot1 = CallSotMessage()和sot1.initSot()
因为这时候有两个Target都可以生成补丁,Demo和SwiftMessages,需要修改拷贝补丁的脚本,加入SwiftMessages:
Step4: 测试热更
测试热更的流程跟之前是一模一样的,只是输出的日志可能会有所区别,我们过一遍。EnableSot=1和GenerateSotShip=0热更注入,先Clean后Build,如果去看编译日志的Link SwiftMessages,也可以看到热更注入的信息。
然后修改MessageView.swift的代码,错误提示的文案会加上“SOT is great”:
GenerateSotShip=1开启生成补丁模式,Clean后Build,查看Link SwiftMessages日志,有提示该函数被热更:
接下来可以看到补丁拷贝脚本日志输出的信息,这里它检测到有两个Target都生成了补丁文件,会把它们两个合成一个,拷贝到Bundle目录下:
启动APP,会看到两条加载补丁的日志,因为我们Demo Target和SwiftMessages Target都调用了API接口:
点击MESSAGE VIEW控件,可以看到错误提示文案后面多了“SOT is great”,热更成功:
Step5: 几点提示
1. Dynamic Library的热更编译改法其实跟主Target,也就是Mach-O Type为Executable的改法是一样,只是这里复用了主Target的一些配置,例如sotsaved目录和sotconfig.sh的路径。增加再多的Target也可以按同样的改法修改它们。
2. 补丁拷贝脚本只需要主Target有就行了,把要热更的sotmodule对应的名字加上即可,条件就是sotsaved目录必须是同一个。
3. 如果需要接入网站版,那么每个需要热更的Target都需要调用API跟网站同步,它们的消耗是独立计费的。
Static Library的改法
上面说到Dynamic Library的改法步骤比较多,而且有诸多缺点,如果能把Framework的Mach-O Type改成Static Library是最好的。由于本例无法修改,这里简单说一下步骤:
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加的配置少一个,即没有链接SDK的.a库文件了。
2. 在Other C Flags以及Other Swift Flags添加-sotmodule $(PRODUCT_NAME) -sotconfig $(SRCROOT)/Demo/sotconfig.sh,这步跟之前是一模一样的。
3. 需要把Target的Enable Bitcode设为No。
4. 修改拷贝补丁的脚本,加入该Target的名字,例如本例加入SwiftMessages,跟之前也是一模一样的:
然后就配置完了,如果是使用网站版,同步一次消耗,就能实现所有Target的热更,修改简单,对包体影响最小。