整体流程:
1.uni-app打包成App,使用plus.runtime.getProperty方法获取本地应用资源版本号。
2.调用后端接口,拿到与后端规定好的版本号,与前面获取的版本号进行对比,如果不一致(也可以判断当前版本号是否小于线上版本号,也就是最新版本号),进行下一步操作。
3.uni.showModal弹出下载提示。
4.使用plus.downloader.createDownload下载安装包。下载完可以使用plus.runtime.openFile(path),打开文件安装。
5.另一种方法是去浏览器下载,使用plus.runtime.openURL(url); 打开一个网址去下载。
6.推荐的方法是使用wgt热更新,这样就不用每次更改都需要对ios包进行加签。这种方法着重记一下。
整包更新
HbuilderX App云打包,证书可以由公司安卓开发人员和ios开发人员提供,打安卓包也可以使用公共测试证书(不推荐,可测试用)。
打包完成会返回一个下载地址,在浏览器下载即可。将下载后的安卓包上传到公司的oss地址,以便之后供用户下载。为什么不放到服务器上?考虑到用户量比较大的情况,服务器可能承载不住。ios打包同安卓打包,多了一步需要加签,将.ipa文件和.plist文件都放到oss上,plist文件中引用ipa文件。
前端关键代码(APP.vue)
// #ifdef APP-PLUS
// 获取本地应用资源版本号
plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
this.$common.set('version', wgtinfo.version);
this.$common.set('versionCode', wgtinfo.versionCode);
// getcfg() 封装的接口方法; data.data.data.tips 提示信息;data.data.data.h5 下载地址
getcfg().then(data => {
if(data.data.code == 1){
// console.log(data.data, "版本号");
if(data.data.data.v !== String(wgtinfo.versionCode)){
uni.showModal({ //提醒用户更新
title: "更新提示",
content: data.data.data.tips,
success: (res) => {
if (res.confirm) { // 跳转到下载页
plus.runtime.openURL(data.data.data.h5);
}
}
})
}
}
})
})
// #endif
wgt热更新
发行,制作应用wgt包,将wgt包放到oss,后台返回wgt地址。
存在问题:使用wgt文件升级问题,安装wgt文件失败[-1205],WGT安装包中mainfest.json文件的version版本不匹配。
解决方法1,把线上的version版本号的首个数字调高;
解决方法2,在安装WGT的时候,添加一个参数,不进行版本对比。force: true
详见:文档地址
App.vue
// #ifdef APP-PLUS
// 获取本地应用资源版本号
plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
this.$common.set('version', wgtinfo.version);
this.$common.set('versionCode', wgtinfo.versionCode);
getcfg().then(data => {
if(data.data.code == 1){
if(data.data.data.v !== String(wgtinfo.versionCode)){
const dtask = plus.downloader.createDownload(data.data.data.wgturl, {force: true}, function ( d, status ) {
if ( status == 200 ) { // 下载成功
var path = (d.filename);
plus.runtime.install(path,{},function(){
plus.nativeUI.closeWaiting();
console.log("安装wgt文件成功!");
plus.nativeUI.alert("应用资源更新完成!",function(){
plus.runtime.restart();
});
},function(e){
plus.nativeUI.closeWaiting();
console.log("安装wgt文件失败["+e.code+"]:"+e.message);
plus.nativeUI.alert("安装wgt文件失败["+e.code+"]:"+e.message);
});
} else {//下载失败
alert( "Download failed: " + status );
}
});
uni.showModal({
title:'版本更新',
content: data.data.data.tips,
confirmText:'下载',
success: (res) => {
if(res.confirm) {
dtask.start();
let prg = 0;
let showLoading = plus.nativeUI.showWaiting("正在下载");
dtask.addEventListener('statechanged', function(task, status) {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下载");
break;
case 3:
prg = parseInt((parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) * 100);
showLoading.setTitle(" 正在下载" + prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下载完成
break;
}
})
}
}
})
}
}
})
})
// #endif