iOS 现在的 “热修复/热更新”

我先来抛一个🧱,为啥苹果大大会禁用JSPatch的“热更新”?以及iOS统计现阶段可以通过审核的“热更新”。
这个砖会在文中进行探究和解答。

首先,在那2017年3月8…,记得那是给女神过节的那一天,苹果爸爸大刀阔斧的砍向了JSPatch领衔的JS动态代码映射技术,顿时,感觉iOS热更技术要变天,之后类似各家大厂SDK中使用了JSPatch的都纷纷移除相关代码让开发者进行更新,直到现在JSPatch发布的1.8.0版本公告中说明都会大概率被拒,1.8.2的版本则在试验过程中:


image.png

但是为什么游戏中的热更新技术不会受到苹果的禁止,作为一名技术人员,不讨论其他角度的问题,只从技术角度来看,为什么 JSPatch苹果认为是不允许的,而游戏引擎的热更新技术,苹果认为是可以的呢?
其实就是JSPatch能够对所有的 Objective-C 的 API 进行映射,允许开发者在 JS 端调用任意原生代码,这会造成重大的安全隐患问题。
游戏中的热更新技术主要的实现方式是把动态脚本下载之后,让动态脚本调用游戏引擎提供的接口实现缺陷修复。与 JSPatch不同的是,动态脚本并不能任意调用全部原生代码,而是只能根据游戏引擎提供的接口调用相关功能。在这个过程中,游戏引擎的原生端作为一个安全沙箱,提供了一个安全的保护层,只要游戏引擎不要对外提供获取通讯录的接口,黑客就无法通过替换动态脚本的方式获取用户的隐私资料。进而可以被认为是安全的,自然就不在苹果的禁止范围内。


WeChatb0d520737ce3a66f1da7b3cc7e46af6c.png

👌总的来说:苹果认为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加载更新方案。

其他

  1. 说明:
    总结不对的地方欢迎纠正😄 ,本文仅供用于学习参考。

  2. 参考资料:
    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345