没做过热更新的,可能感觉很难,但是当你知道逻辑流程后,就非常简单了。
一、下面先给大家介绍一下流程:
1、打一个wgt包,放在服务器上,确保能被访问。
2、前端获取到当前版本号,传到服务端
3、服务端对比客户端传来的版本号和即将更新的版本号,不一致就返回wgt地址
4、客户端接收到wgt地址,下载,安装即可
二、具体实现
1、打wgt包
2、客户端代码
获取当前版本号
// #ifdef APP-PLUS // 获取当前项目信息
let that=this;
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
that.comparisonVersionNo(widgetInfo.version); });
// #endif
检查接口,是否需要更新,获取wgt包
comparisonVersionNo(version){
let that=this;
console.log(version);
let data = {
versionNo:version
};
this.$uniRequest.get('/app/comparisonVersionNo', {
data: data
})
.then(res => {
// console.log(222222);
if (res.data.retCode == 'SUCCESS') {
let versionNos=res.data.retData.versionNos;
console.log(versionNos);
let filePath=res.data.retData.filePath;
if(versionNos==1){//服务器返回1更新,0则不更新
uni.showModal({
title: '提示',
content: '发现新版本,是否升级',
success: function (res) {
// console.log(widgetInfo.version);
if (res.confirm) {
console.log('用户点击确定');
that.getProperty(filePath);
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}
}
})
.catch(error => {
console.log(error);
});
},
下载并升级
getProperty(getProperty){
let that=this;
// 在线升级app/热更新
that.showwri=true;
const downloadTask=uni.downloadFile({ //下载文件
url: 'https://wechat.zhishidao.com/'+getProperty,
success: (downloadResult) => {
// console.log(downloadResult);
if (downloadResult.statusCode === 200) {
// 更新升级
plus.runtime.install(downloadResult.tempFilePath, {
force: false
}, function() {
// console.log('install success...');
that.showwri=false;
plus.nativeUI.alert("应用资源更新完成!",function(){
plus.runtime.restart();
});
}, function(e) {
that.showwri=false;
plus.nativeUI.alert("更新失败,请稍后再试");
});
}
}
});
downloadTask.onProgressUpdate((res) => {//下载文件的进度
that.totalBytesWritten=res.totalBytesWritten;//当前下载大小
that.progress=res.progress;//当前下载比例
that.totalBytesExpectedToWrite=res.totalBytesExpectedToWrite;//
});
},
3、服务端实现
服务端实现非常简单,大致为:
接收客户端传入的版本号,然后与数据库中的版本号对吧,不一致就返回wgt地址及更新信号。版本号数据库手动改就好,如果有更加好的方法,欢迎补充