博客> [原创] iOS 可用的热更新、热修复方案
[原创] iOS 可用的热更新、热修复方案
2019-11-17 04:40 评论:0 阅读:236 bty19921123
ios 热更新 热修复

前言

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

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

解决方案

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

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

<objc>
<objc>
JS

js会写点,ES5就可以。

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

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

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

下面的开发问题记录

都是一些很经典的问题。比单纯理解性记忆runtime源码要更深刻,毕竟实践出真知嘛


关系方法注册和方法覆盖设计方案

  • Oc 不存在的方法,无需注册到Oc中,只在Js端保留方法信息,供Js端代码直接调用
  • Oc 已存在方法,需要先获取 original IMP,将原方法 IMP 替换成我们的消息转发,然后重新添加一个以 original IMP 为实现,*** 为前缀的新方法。

JS中声明Oc中的Class设计方案

首先我们要搞清楚JS中引入新Class

1、Class能被识别(非undefined) 2、Class能调用方法

第一步让我们看看怎么做,如何让Oc Class能被JS识别呢?

我们可以将Oc Class注册到global中,这样我们的Class就能被JS识别,而不是undefined类型.

Class能识别了,那么在JS中如何才能调用Oc的方法而不报错呢?

这个问题其实很简单,我的解决方案将 impoet Class包装成类似于NSObjectJSObject

class JSObject {
    constructor(className,instance) {
        this.__isa = instance ? instance : null;
        this.__metaIsa;
        this.__className = className;
        this.__isInstance = instance ? true : false;
    }
}

这样子的,JSObject作为操作对象就使我们接下来的方法调用变得可行。 因为如果以String的方式存到global中是不合理,首先当前调用者的信息我们无法全部保存,然后就是String如何像对象一样调用方法,所以看上去这是唯一可行的方案。

现在知道了我们所有的对象都是JSObject,下面看一段实际场景下的JS代码

UIView.call('alloc').call('initWithFrame:',new TTReact(120,100,100,100))

相信了解JS的人心里已经有了答案,其实我们只需要给JSObject 添加一个call()方法,这样所有的方法调用都经由call()方法做发送处理.

我之前看过JSPatch的使用文档,贴上一段代码:

UIView.alloc().init()

很好奇他是怎么做的,竟然可以在JS端调用Oc的方法.实现这个功能的方法是把所有的Oc方法注册到 JSObject 中,但是了解iOS的开发者知道,这是不友好的,任何一个class的继承关系都是很复杂的,感觉不是一个很小的工作。 所以这也是我没有像JSPatch这么写的原因。

但是,可但是其实不是这样子的,JSPatch并不是真的可以在JS中调用Oc方法,他其实在Native端加载前做了转换,将

UIView.alloc().init()

转成了

UIView.c('alloc').().c('init').()

大概就是这样吧,毕竟我是要自己写一套热更新机制,所以没有过多的看JSPatch具体实现,只是拿来和我的方案做比较,如何做更适合。

JS调用Oc方法,如何支持 多参数多类型 调用

未完待续


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

收藏
0
sina weixin mail 回到顶部