写给 iOS 程序员的 Weex 教程(5):增量更新实现

2017/3/21 22:32 下午 posted in  iOS comments

Weex 的一大特点就是可以热更新,绕过 App Store 的审核。但 Weex 本身没有提供相关工具,需要我们实现。

就热更新本身而言,最简单的方案是下载一个 zip 包,然后解压替换原来的。只是这个方案的缺点是每次都需要下载一个完整的 zip 包,耗时长和浪费用户流量。我们期望的是每次只更新有变化的,这样能最小化下载体积。

那有什么方案能自动化的找出两个版本之间的变化文件,并更新它?
想想似乎会是一个很复杂的方案,文件那么多,还要记住每个版本有哪些文件,再比对,想想就头大。
能不能实现呢?这个也是能实现的,想想 git 怎么做的。

有没有其他方案实现增量更新呢?
我们换个思路想想这个问题。每个版本我们都会打包成一个 zip 文件。现在如果有一个工具能实现以下两个需求就能解决增量更新的问题:

  1. 比较两个 zip 包 A 和 B,并生成从 A 到 B 的差异文件 patch;
  2. 能用 A + patch 的方式生成 B;

现在就有这样一个工具:bsdiff
bsdiff 是一个从二进制层面去比较文件的工具,能比较任何文件。它是开源的,源代码是 c 语言写的,可以很方便集成到 iOS 里。

bsdiff 分两部分:bsdiff 和 bspatch。bsdiff 用来生成 patch,bspatch用来还原。客户端只需要集成 bspatch,然后利用服务端获取 patch + 老版本去生成新版本。核心原理就这么简单。

剩下的就是根据业务需要服务端提供一个接口来告诉客户端什么时候有新版本和 patch 地址。

国内有一个团队做了一个 react native 的增量更新服务 pushy。它的客户端 sdk 这块是开源的:react-native-pushy。他们也是利用 bsdiff 来实现增量更新,大家可以参考一下。

这篇我没贴什么代码,因为原理很简单,讲出来大家就能理解了。下一篇会讲本地图片在 weex 里的使用