注册

iOS 可用的热更新、热修复方案

前言
JSPatch虽然在两年前被苹果邮件警告,但是ReactNative依然盛行,只不过ReactNative并没有对Native进行热修复的功能,只是动态下发新的bundle模块。动态加载而已。

很多时候线上出现bug,可能是很小,很细微的。对此我们可能仅仅需要改动一个返回值就能解决线上bug。但是实际上我们并没有这么一套机制去对线上bug进行热修复,只有通过发版才能解决,这样对用户很不友好。

解决方案
Rollout.io 、 JSpatch、 DynamicCocoa、React Native、 Weex、Wax 、Hybrid
其实业界还是有很多方案的 -_-!

看了一下JSPatch的使用文档,其实就是把JS代码通过Oc的动态运行时,将JS方法调用映射到Oc的对应类和方法。
我们的技术栈储备如下:

<objc/runtime>
<objc/message>
JS

js会写点,ES5就可以。

下面就可以开始。按照JSPatch文档提供的功能,一步一步自己实现对应功能,想一下。以后大家就可以在手机上写代码,很刺激吧~

TTPatch开发问题记录

现在开发成果已经可以热修复,热更新,动态调用Oc方法,参数返回值类型处理,方法hook

对热更新、hook、感兴趣的同学可以下载demo玩玩。后续会跟目前JSPatch支持的功能看齐,但是具体实现是不一样的哦。大家可以对比一下各自实现的优缺点。
我知道肯定是我写的low,算是抛砖引玉吧~,希望大家提问,指正。

Commit问题记录

1.内存问题
解决方式 使用 __unsafe_unretained 修饰临时变量,防止 strong修饰的临时变量在局部方法结束时隐式调用 release,导致出现僵尸对象

2.Oc调用js方法,多参数传递问题
这里面利用arguments和js中的apply,就可以以多参数调用,而不是一个为数组的obj对象

3.关于添加addTarget——action方法
为View对象添加手势响应以及button添加action时,action(sender){sender为当前控制器 self} 为什么Oc中使用的时候sender为当前的手势orbutton对象?
如果Native未实现action方法,那么会导致获取方法签名失败而导致我们无法拿到正确参数,所以获得的参数为当前self.
这里要记录强调一下,如添加不存在的action时,要注意action参数不为当前的事件响应者.

4.JS调用Oc方法,如何支持 多参数、多类型 调用
首先,我们要讲目标Class的forwardingInvocation:方法替换成我们自己的实现TTPatch_Message_handle,
然后通过替换方法的方式,将目标方法的IMP替换为msg__objc_msgForward,直接开始消息住转发,这样直接通过消息转发最终会运行到我们的TTPatch_Message_handle函数中,在函数中我们可以拿到当前正在执行方法的invocation对象,这也就意味着我们可以拿到当前调用方法的全部信息,并且可以操作以及修改。我们也是通过这个方法来实现,返回值类型转换。返回值类型转发这里涉及到

然后通过替换方法的方式,将目标方法的IMP替换为msg__objc_msgForward,直接开始消息住转发,这样直接通过消息转发最终会运行到我们的TTPatch_Message_handle函数中,在函数中我们可以拿到当前正在执行方法的invocation对象,这也就意味着我们可以拿到当前调用方法的全部信息,并且可以操作以及修改。我们也是通过这个方法来实现,返回值类型转换。返回值类型转发这里涉及的细节比较多,暂时只说一下最好的一种解决方案。

《--------------------Github地址----------------》

上传一张Demo动态图

e3f1a1685405b0f06b4f3ad75d1446f0.gif

感兴趣的读者可以下载玩一玩.欢迎提出宝贵意见

转自:https://www.jianshu.com/p/1daf20977c4a

2 个评论

写得好
谢谢

要回复文章请先登录注册