Swift热更新调研(2021)

2,674 阅读5分钟

本篇只探讨原生Swift实现热更新的可行性,不包括RN、flutter等前端技术2333.

早在2017年就应该完全掌握的技能,到现在又得重学一次,在那一年苹果阻挠,造成了普遍性的iOS热更不顺利,事到如今,我们回过头,也可以看看这个特性对于开发到底有什么影响,为什么苹果如此排斥热更新。

大概意思:动态下发代码、运行时动态更新

最初,热更新是为了做到修复bug 或动态运营,以修复为主的目的,这样的前瞻性对于代码修复层面是影响巨大的。直到后来演变成恶意应用为了躲避多次审核,而进行的一种线上快速迭代的方式,渐渐偏离了主题。

热更新技术的平台

AliHotFix、lua、swiftHotFix、Sot、jspath、BuglyHotfix

JSPatch

目前演变成开源的旧版和平台的新版

1.开源版

需要自建后台,检验测试和下发脚本,但是很久没更新了,由于其它的原因,目前把重心放在平台版维护上,也建议我们使用平台版

价格:免费

2.平台版

公告中显示:通用版SDK1.8.0平台声明有较大概率审核被拒

内测版SDK1.8.2处于测试阶段,需要联系获取插件,平台也不能确保过审

价格:

截屏2021-11-19 下午2.36.48.png

每个新注册的用户会有30天的标准版试用期,不限日请求量。到期后若没有续费会自动降为基础版。

日请求量目前以每日调用 sync 的次数为准,每次执行 SDK 接口 [JSPatch sync] 都会向平台后台发送一次请求,后台会统计每日请求成功的数量作为日请求量。超过日请求量1w,会无法下发新的补丁,但已下发的补丁会正常运行。

可用性

因为JAPatch是利用OC语法Runtime的动态消息特性,将js文件下发动态发替换。Swift属于静态语法,所以JSPatch不支持swift原生代码热更新,单纯使用Swift原生类将会造成崩溃,Swift中独有的特性无法增加dynamic动态性。继承NSObject尝试将swift语法做OC化处理,以便验证后期的动态替换的可执行性

缺点: 对纯Swift原生语法不太友好,需要掌握适配的js语法。此框架发布较早,动态下发的技术被苹果审核针对过

因为我们项目主体语法是Swift,JSPatch兼容OC,所以他有特定的OC转JS工具。学习框架下的JS语法并用它去跟Swift语法交互是比较麻烦的地方

优点:

框架比较成熟,目前还在持续更新

BuglyHotfix

长时间停止更新维护,属于腾讯bugly中热更插件库,核心业务还是使用的JSPatch技术。

已验证,无法激活平台管理和动态下发。

AliHotFix阿里

Hotpatch技术,开发者网站找不到iOS入口,据说有接入门槛(20w月活钉钉群联系),平台声明不保证能过审。

lua

基于Unity3D,将动态下发的js文件,替换成lua

缺点:

需要掌握C#和lua语法,学习成本较高。时间充裕的同学可以深挖下~

SOT

基于虚拟机实现热更,易于Swift原生代码开发,学习成本低,不需要单独去熟悉js代码,只用在原有代码上做修改,通过分析与原有代码的差异定位并生成补丁,完成函数更新和替换。据官方文档描述,不会影响过审

价格

截屏2021-11-19 下午3.48.59.png

缺点: 需要原生搭建环境,新手接入比较麻烦,且因为平台较新,仅仅只有官方文档作为参考,可供查阅的资料较少

优点:

据官方说不会影响审核,并且可以兼容Swift

最终筛选出了JSPatch、SOT两种方案。并通过了接入测试,成功下发补丁。 关于JSPatch一直是iOS热更的老大哥,江湖地位犹在,排除掉iOS严格的审核机制,相信是很多人的首选,SOT初生牛犊,也让我体会到了它的神奇之处。简言之:

JSPatch易于接入,易于上手,尤其是平台版的接入,风险控制得到提升,可操作性更强了,对于下发js脚本通过js代码去调度原生的方法,让人容易理解,但也仅仅是针对OC来说的,对于纯Swift代码的处理显得并没有那么的友善,要处理动态声明以及属性访问中的公共类型等,都使它对于Swift使用者来说有那么一丝多余。js脚本的转换也是一个头疼的地方,但官方对于OC有着天然的js转换和检查工具,语法衔接部分相信不会太难。

SOT,需要原生搭建环境,且新手接入调试会比JSP麻烦,本质上与JSP有着完全不同的路数,他通过代码比较生成差异补丁,通过虚拟机处理修复更新,我还是很服气的,每一种新技术的产生后面都付出了很多努力和尝试。可以说Swift无缝切换,是最吸引我的,并且上面说的比较代码差异,对我来说就是在原有代码上做改变,这样在我下次更新包的时候就可以把改动的代码一起提交,省事省心省力。当然,它也不是完美,它还有很多遗憾,我会放到后面文章中去聊,下次见。