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,无限热更新。却永远都对不上。所以无限重启)括号内容仅仅是猜测,没有和官方沟通。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
