react-native-update@4.0版本 具体热更新的机制
热更新原理
热更新的方法热更新又分为全量更新和增量更新。
启动程序的时候,会发一个请求给服务器,询问我需不需要更新
{ "upToDate": true,"ok": 1 } 这个是服务器返回给我的值,如果是已经是最新的版本了,就会返回upToDate给我。 { "expired": true,"downloadUrl":'xxx',"ok": 1 } 如果是需要硬版本更新了,就会返回一个expired的给我,顺便给我一个downloadUrl(随便写的,具体可能不是这个名字,懒的再去删版本看了)的参数,当然这个参数是我在他家官网配置的,就是我新版本的下载地址。 这个时候,如果是需要热更新了,根据当前版本 { "update": true,"hash": "FppJ-yU8-_bvYJe5Sg5_opUp_eFH","name": "0.2.1","description": "test","metaInfo": "0.2.1","updateUrl": "http://update-packages.reactnative.cn/FppJ-yU8-_bvYJe5Sg5_opUp_eFH?e=1483510148&token=made75kGFhOozkiRfa7LK_E1xG1pLOnhW8fhbnev:t2YXoxZZXQImvvyHH1hdrnNNRmQ=","pdiffUrl": "http://update-packages.reactnative.cn/lpKbEZnU6_T-mvwZGfzIQby489Bm-FppJ-yU8-_bvYJe5Sg5_opUp_eFH.pdiff?e=1483510148&token=made75kGFhOozkiRfa7LK_E1xG1pLOnhW8fhbnev:YBI4sdIEr30wa1DHV4xnMUlI1bU=","ok": 1 } update为true代表我需要热更新,其中有个参数叫updateUrl,这个参数提供的地址就是全量更新的地址,会把我整个bundle都下载下来。 关于服务器是否返回pdiffUrl的情况我还是不能推算出官方的原理,因为同样的一个包,有的时候它会返回pdiffUrl,有的时候却只有updateUrl,不过好在不管什么情况下,都有updateUrl,那么我们就可以利用这个点,把不必要的等待给改掉。 export async function downloadUpdate(options) { if (!options.update) { return; } if (options.diffUrl) { await HotUpdate.downloadPatchFromPpk({ updateUrl: options.diffUrl,hashName: options.hash,originHashName: currentVersion,}); } else if (options.pdiffUrl) { await HotUpdate.downloadPatchFromPackage({ updateUrl: options.pdiffUrl,}); } else { await HotUpdate.downloadUpdate({ updateUrl: options.updateUrl,}); } return options.hash; } 这个就是它判断是否走增量更新的代码,其中diffUrl我从来没见到过,所以不动逻辑,所以很简单,把增量和全量调换个顺序就OK了 export async function downloadUpdate(options) { if (!options.update) { return; } if (options.diffUrl) { await HotUpdate.downloadPatchFromPpk({ updateUrl: options.diffUrl,}); } else if (options.updateUrl) { await HotUpdate.downloadUpdate({ updateUrl: options.updateUrl,}); } else { await HotUpdate.downloadPatchFromPackage({ updateUrl: options.pdiffUrl,}); } return options.hash; } 搞定,亲测后发现,安卓在即使服务器给了我pdiffUrl的情况下,我依然也会去选择全量更新,恩,也就费个3M流量,但是大家都是无线网,所以20S以内,这个热更新肯定就好了,就不需要等待那么久了。 问题
(update.cn上的包是7号,给用户下载地址上的包是8号,8号的程序内容比7号仅仅是多了几个文案修改。这个时候,我推送一个热更新上去,名字叫10号。那么它的计算方式本来是10号减去7号的 = 3,然后拿着这个3去加7 = 10,更新成功。但是你手里的包却是8,他还是拿10-7=3,3+8 却=11!=10.boom爆炸。11!=10,无限热更新。却永远都对不上。所以无限重启)括号内容仅仅是猜测,没有和官方沟通。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |