cordova-hot-code-push-plugin(如下简称chcp)自己已经支持自动检查更新、下载、安装,具体内容能够搜索“cordova热更新”,或查看官方wiki。本文主要介绍如何使用chcp提供的JS API控制整个热更新过程,包括其中一些注意事项。本文仅针对安卓,iOS暂未验证。javascript
chcp提供的API基本能知足大部分功能,但为了知足需求还须要解决如下问题:java
针对问题1:在配置文件chcp.json中新增字段表示更新内容,并经过直接请求或调用API获取,好比"message":"1. bug修复..."
,并在具体流程中展现弹窗(本文是在更新内容下载完成后,也能够在检查到有更新的时候)git
针对问题2:单独请求服务端的chcp.json,并跟本地的版本比较,不一样就认为有更新,能够当即反馈给用户github
data.currentWebVersion
对应www/chcp.json中的release,本地配置,就是比较版本要用到的data.readyToInstallWebVersion
本次要安装的版本,为空多是没有获取到服务端配置,或者已经是最新版data.previousWebVersion
更新后的上一个版本,为空说明尚未更新过data.appVersion
版本号,对应config.xml中的widget的version,本地配置data.buildVersion
构建版本号,本地配置json
实际测试,只要服务端的release
字段和本地的currentWebVersion
不一样,chcp就认为须要更新,而不会检查appVersion
或者buildVersion
是否相同(chcp.json中也没有这两个字段)。服务器
若是有更新,fetchUpdate
只有在下载完成全部更新后才执行回调函数。若是正在下载更新,回调函数会当即执行,err.code
为-17。为了区分上述两种状况且只有一次提示,首次检查到有更新时,提示能够使用setTimeout
延时,回调函数执行时,先clearTimeout
,再执行有error时的提示。app
须要注意的是,下载成功后,回调函数中data的内容以下:函数
{ config: '"release":"xxx",...' }
其实就是把chcp.json的内容做为字符串做为config属性的值。若是要获取里面的值,须要作一次JSON解析。测试
若是没有调用过fetchUpdate
,或者已是最新版,则error存在,表示没有能够安装的更新,须要获取更新,具体参见官方示例。fetch
另外,最好将自动下载和自动安装关闭,防止冲突:
config.xml <chcp> <auto-download enabled="false" /> <auto-install enabled="false" /> </chcp>
// 获取本地的currentWebVersion,并和服务端的release比较 function compareVersion(serverVersion) { return new Promise((resolve, reject) => { window.chcp.getVersionInfo((error, data) => { console.log('getVersionInfo', data); if (error) { reject(error) } else { resolve(data.currentWebVersion === serverVersion); } }); }); } // 请求服务端chcp.json function checkUpdate() { const url = "https://yourserver/chcp.json"; fetch(url).then(res => res.json()).then(data => compareVersion(data.release)).then(isEqual => { if (isEqual) { toast('已经是最新版'); } else { // 流程2,检查是否有可安装更新 checkAvalilable(); } }).catch((error) => { console.log('checkUpdate failed', error) }); } // 检查是否有可安装的更新 function checkAvalilable() { console.log('checkAvalilable'); window.chcp.isUpdateAvailableForInstallation((error, data) => { if (error) { console.log('isUpdateAvailableForInstallation error', error); checkHotUpdate(); return; } // 已有可安装版本 beforeInstallAlert(); }); } // 获取更新 function checkHotUpdate() { console.log('checkHotUpdate'); const waitingId = setTimeout(() => { toast('有新版,开始更新'); }, 200); window.chcp.fetchUpdate((error, data) => { if (error) { console.log('fetchUpdate error', error); clearTimeout(waitingId); if (error.code == 2) { toast('已经是最新版'); } else if (error.code == -17) { toast('正在下载更新中...'); } else if (error.code == -2) { // 须要下载apk } else { toast(`出错了: ${error.code}`); } return; } // 服务器版本信息 console.log('fetchUpdate data', data); // JSON解析config const config = data && data.config && JSON.parse(data.config); console.log('fetchUpdate config', config); // 下载完成,message为自定义字段,表示更新内容 beforeInstallAlert(config && config.message); }); } function beforeInstallAlert(message) { // 弹窗逻辑,点击“当即体验”调用installUpdate() } function installUpdate() { console.log('installUpdate'); window.chcp.installUpdate((error) => { if (error) { console.log('installUpdate error', error); toast(`安装失败: ${error.code}`); return; } console.log('installUpdate done'); }); }
err.code参见Error codes