我先来抛一个🧱,为啥苹果大大会禁用JSPatch的“热更新”?以及iOS统计现阶段可以通过审核的“热更新”。
这个砖会在文中进行探究和解答。
首先,在那2017年3月8…,记得那是给女神过节的那一天,苹果爸爸大刀阔斧的砍向了JSPatch领衔的JS动态代码映射技术,顿时,感觉iOS热更技术要变天,之后类似各家大厂SDK中使用了JSPatch的都纷纷移除相关代码让开发者进行更新,直到现在JSPatch发布的1.8.0版本公告中说明都会大概率被拒,1.8.2的版本则在试验过程中:
但是为什么游戏中的热更新技术不会受到苹果的禁止,作为一名技术人员,不讨论其他角度的问题,只从技术角度来看,为什么 JSPatch苹果认为是不允许的,而游戏引擎的热更新技术,苹果认为是可以的呢?
其实就是JSPatch能够对所有的 Objective-C 的 API 进行映射,允许开发者在 JS 端调用任意原生代码,这会造成重大的安全隐患问题。
游戏中的热更新技术主要的实现方式是把动态脚本下载之后,让动态脚本调用游戏引擎提供的接口实现缺陷修复。与 JSPatch不同的是,动态脚本并不能任意调用全部原生代码,而是只能根据游戏引擎提供的接口调用相关功能。在这个过程中,游戏引擎的原生端作为一个安全沙箱,提供了一个安全的保护层,只要游戏引擎不要对外提供获取通讯录的接口,黑客就无法通过替换动态脚本的方式获取用户的隐私资料。进而可以被认为是安全的,自然就不在苹果的禁止范围内。
👌总的来说:苹果认为JSPatch这个使用了dlopen(), dlsym(), respondsToSelector:, performSelector:,method_exchangeImplementations() 等反射函数动态调用OC的API是危险的,那现在iOS还有热更新吗,答案是肯定的,而且还不少,但是大部分都是JS开发的项目,这些项目肯定是可以热更的,那iOS热更有哪些呢,哪些是原生的呢,接下来我们就探究一下“市面上的热更新/热修复”。🍉🍉🍉(当然,企业账号就用JSPatch就可以了)
一、游戏类的热修复
像老的cocos2dx和新的creater,还有u3d都用的lua脚本拉取;
二、阿里百川Fix
原生可接入的SDK,这个条件是需要20万的日活,才会给SDK;
三、Weex、RN、Hybrid等
本身由js编写的代码,自然可以进行js进行bundle拉取
四、TTPatch、MangoFix等修复
https://github.com/yangyangFeng/TTPatch
https://github.com/YPLiang19/Mango
两个方案原生可都接入
TTPatch:是JSPatch的一个简化版,用的是js的解释器,支持的语法也比较全面,底层原理和JSPatch是差不多的,中间通过替换方法的方式,将目标方法的IMP替换为_objc_msgForward,直接开始消息转发,然后在经过resolveInstanceMethod 、forwardingTargetForSelector、methodSignatureForSelector到forwardInvocation里获取到执行方法的invocation对象,之后进行操作以及替换,不支持swift热修复(可以集成用于动态添加类)。
MangoFix:是DSL即 “领域专用语言”,用的是解析器进行词法、语法、语义检查和分析,作者用到了libffi库(用于高级语言之间的相互调用)进行运行时动态创建C函数,然后在创建的C函数中查找MangoFix脚本中方法并调用(这个用了类似dlsym的symdl进行动态调用函数,
),然后用刚刚创建的C函数替换原来Method的IMP指针并保留原有的IMP指针,🍉 y1u1这个方案确实不错,在语法上类似OC语法,上手挺快,但缺点也很显著,毕竟解析方式都是作者写的,在语法上支持的不全面,比如rac的语法就很头疼,不支持swift热修复(可以集成用于动态添加类)。
🍉总结一下:游戏的热修复指望不上,阿里和腾讯的SDK门槛点儿高,Weex、RN、Hybrid这三种方案原生App只能看看,则最后的两种方案原生可以集成使用,目前均可以上架,笔者用的就是MangoFix做的小功能热修复,如果没有拉取到需要修复脚本可以不初始化热修复模块,脚本信息加密然后拉取到沙盒后解密加载。
补充:使用stinger进行aop的方案也可以实现热修复/热更新。
补充:flutter 官方声明是暂时不支持热更新的,但是flutter支持web开发,于是“flutter+web技术对接”这个热更方案出来了,大致上是还是用js加载更新方案。
其他
说明:
总结不对的地方欢迎纠正😄 ,本文仅供用于学习参考。参考资料:
TTPatch :https://github.com/yangyangFeng/TTPatch
MangoFix :https://github.com/YPLiang19/Mango
MangoFix原理分析 :https://www.jianshu.com/p/a6511c687eda
动态调用&定义C函数:https://www.jianshu.com/p/92d4c06223e7
Unity3D游戏轻量级xlua热修复框架 :https://www.cnblogs.com/SChivas/p/7893048.html