iOS 你需要知道的热更新

    闲来喝茶,和朋友聊到热更新。JSPatch在今年6月份被叫停,然而微信的小程序,滴滴app都在用热更新的相关技术,他们是怎么做到的呢。接下来我们一探究竟。

在iOS7之后,苹果开源了JavaScriptCore,极大方便了开发oc和js的交互,这意味着在oc代码里面可以写js的代码了,关键是这给研究及时修复技术带来了福音,我们可以做好多事了!

iOS里游戏里面的更新,或者插件更新,或者12306APP,打开APP有更新的时候会提示您更新,它是怎么做到的呢,对于新技术我们需要保持好奇心和持续的专研精神。那么热更新的原理是什么呢。更新的源码都在服务器上,客户端发起请求更新时,服务期以字符串的形式下发,客户端接收完源码,需要JavaScriptCore的解析成js的代码,然后通过lua等类似的解析器,把js代码转化成oc代码,至此完成源码的更新。

JSPatch是怎么被苹果检测出来的呢,苹果检测编译的程序编译的片段,与JSPatch编译的源码比较,如果有高度相似的片段,则认为app使用了JSPatch。

React Native 热更新 是怎么做的?

RN会将一系列资源打包成js bundle文件,系统加载js bundle文件,解析并渲染。所以,RN热更新的根本原理就是更换js bundle文件,并重新加载,新的内容就完美的展示出来了。

下面的代码片段是生成diff-bundle的总体流程

public void windowsDiffCreator(String desDir,String sourceProjectDir) {

//根据根路径 创建对应的文件夹

    prepareDir(desDir);

    //清空newDir下的文件

    deleteNewDirChildFiles();

    //执行bundle打包命令

    doReactNativeBundle(desDir, sourceProjectDir);

    //与old进行diff算法

//将diff目录下的文件都删除掉

    deleteDiffDirChildFiles();

    //生成diff所有文件

    createDiff();

    //删除old文件夹下所有资源

    deleteOldDirChildFiles();

    //将new文件夹下的所有资源copy到old中

    copyNew2Old();

    //压缩diff文件夹到rootDir中

    ZipUtils.zipMultiFile(getDiffFileDir(),getRootDir()+"/diff.zip",false);

}

注解:

根据外部传入的desDir(生成diff相关的root目录)和sourceProjectDir(project所在的目录,目的是调用bundle打包的命令)执行以下几步操作:

1、准备工作:在desDir目录下,创建如下几个文件夹

(1)、new:bundle打包命令执行后的目标路径,里面会有bundle文件、全量的资源文件

(2)、old:上一次执行完bundle打包命令后的bundle文件和全量的资源文件,目的是用作diff-bundle时的参考对比目录

(3)、diff:new和old两个文件夹对比后,生成的差量文件夹,里面存放差量的diff-bundle文件和资源的所有差量文件

2、删除new目录下的所有文件,打包前先清空new路径下的所有文件

3、执行bundle的打包命令:执行cmd命令,进入到当前project所在路径,然后执行react-native bundle命令,执行bundle打包命令

4、将生成出来的new文件夹和old文件夹进行对比,生成diff文件夹

(1)、使用google提供的diff_match_patch,对bundle进行diff处理

(2)、对全量的资源进行diff算法,目前有局限性:新的资源文件名称必须区别于旧的资源文件名称,即不能出现覆盖文件的现象

5、生成diff文件完毕后,将old文件夹清空,并将new的文件夹下所有文件copy到old文件夹下

6、对diff文件夹进行压缩处理,该压缩文件就是被放到server端,供用户下载的差量bundle文件

7、对生成的diff.zip文件进行MD5计算,生成MD5.txt,放到server端,供用户下载判断是否需要下载增量diff.zip包

阿里出的框架 weex

Weex 致力于使开发者能基于通用跨平台的 Web 开发语言和开发经验,来构建 Android、iOS 和 Web 应用。简单来说,在集成了 WeexSDK 之后,你可以使用 JavaScript 语言和前端开发经验来开发移动应用。

weex 热更新方案 : https://www.jianshu.com/p/2f1bce475741

我们怎么自定义自己的热更新。

服务端:

每次发布一个新版本自动打包一个dist.zip

利用bsdiff与所有老版本的dist.zip分别生成差分包

检测版本更新接口至少上传一个个参数:oldVersion。匹配若不是最新版需要返回对应差分包的下载地址

客户端:

检测版本更新,下载差分包

利用bspatch,将本地olddist.zip和差分包合成新的dist.zip包

设计两种版本更新方式

大版本更新,弹框告知强制更新;

小版本更新,静默下载更新(适用于修复bug);

沙盒dist中js文件需要加入防篡改机制(root安卓和越狱ios),哈希校验或者其他方式。(校验不通过方案:可以考虑重新下载该文件,或者利用bspatch重新生成新的dist.zip)

qq:417497299

你可能感兴趣的:(iOS 你需要知道的热更新)