更新,更新要在项目刚打开就进行检测,所有的代码,都事写在app.vue的,如有不对,欢迎指出! app 参考文献
- 整包更新:ask.dcloud.net.cn/article/349…
- 资源文件热更新(wgt升级):ask.dcloud.net.cn/article/356… 检测小程序更新
const updateManager = uni.getUpdateManager();
const updateManager = uni.getUpdateManager();
updateManager.onUpdateReady(function(res) {
uni.showModal({
title: '版本更新',
content: '新版本已经准备好,请重启应用!',
showCancel: false,
confirmText: '立即重启',
success(res) {
if (res.confirm) {
updateManager.applyUpdate();
}
}
});
});
//上面的就够用了 要是想处理断网的情况 可以加个下载失败
updateManager.onUpdateFailed(function (res) { // 新的版本下载失败 });
检测APP更新
app更新就比较麻烦了 先从后台请求最新版本的数据 然后获取当前版本的版本号等数据 进行对比。然后根据后台返回的数据来判断是热更新还是整包更新,整包更新跳往下载页去更新,热更新进行弹窗更新,
getAppUpdate(isShowUpdateHint) {
if (this.globalData.isUpdateApp) {
showToast({ msg: '您正在下载最新版本' });
return;
}
// #ifdef MP-WEIXIN
const updateManager = uni.getUpdateManager();
updateManager.onUpdateReady(function(res) {
uni.showModal({
title: '版本更新',
content: '新版本已经准备好,请重启应用!',
showCancel: false,
confirmText: '立即重启',
success(res) {
if (res.confirm) {
updateManager.applyUpdate();
}
}
});
});
// #endif
// #ifdef APP-PLUS
let that = this;
appUpdate(isShowUpdateHint ? '检测更新...' : '')
.then(result => {
const data = JSON.parse(result.Data);
let serverVersion = data.AndroidVerName;
if (plus.os.name == 'iOS') {
serverVersion = data.IOSVerName;
}
serverVersion = parseInt(StringUtils.charParseAll(serverVersion, '.', ''));
let updateDesc = StringUtils.charParseAll(data.ApkSize, '¥', '\r\n');
let isWgt = true;
let downloadUrl = data.AppWgtURL;
if (data.IsWgt == '0') {
//整包更新
isWgt = false;
let version = StringUtils.charParseAll(plus.runtime.version, '.', '');
version = parseInt(version);
if (serverVersion > version) {
if (plus.os.name == 'Android') {
downloadUrl = data.ApkWebURL;
} else {
downloadUrl = data.IOSLinkURL;
}
that.showUpdateAppModal(isWgt, updateDesc, downloadUrl);
} else {
if (isShowUpdateHint) {
showToast({ msg: '已是最新版本' });
}
}
} else {
//热更新
plus.runtime.getProperty(plus.runtime.appid, function success(wgtInfo) {
let version = StringUtils.charParseAll(wgtInfo.version, '.', '');
version = parseInt(version);
if (serverVersion > version) {
that.downloadApk(isWgt, updateDesc, downloadUrl);
} else {
if (isShowUpdateHint) {
showToast({ msg: '已是最新版本' });
}
}
});
}
})
.catch(reason => {
if (isShowUpdateHint) {
showToast({ msg: '网络错误,请稍后重试!' });
}
});
// #endif
},
/**
* 下载安装包
*/
downloadApk(isWgt, updateDesc, downLoadUrl) {
let that = this;
this.globalData.isUpdateApp = true;
if (!isWgt) {
showToast({ msg: '开始下载...' });
}
console.log(isWgt, updateDesc, downLoadUrl);
if (isWgt) {
uni.downloadFile({
url: downLoadUrl,
success: result => {
if (result.statusCode == 200) {
plus.runtime.install(
result.tempFilePath,
{
force: true
},
function success() {
that.showUpdateAppModal(true, updateDesc, '');
},
function fail() {}
);
}
},
fail: () => {
showToast({ msg: '下载安装包失败,请检查您的网络是否连接' });
},
complete: () => {
getApp().globalData.isUpdateApp = false;
}
});
} else {
uni.navigateTo({
url: '?url=' + downLoadUrl
});
this.appUpdateProgressListener();
}
},
/**
* 显示更新提示,并执行更新操作
*/
showUpdateAppModal(isWgt, updateDesc, downLoadUrl) {
showModal({
title: '版本更新',
msg: updateDesc,
cancelText: '暂不更新',
confirmText: '立即更新'
}).then(() => {
if (isWgt) {
plus.runtime.restart();
} else {
if (downLoadUrl.indexOf('itms-apps') != -1) {
plus.runtime.openURL(downLoadUrl);
} else {
this.downloadApk(isWgt, updateDesc, downLoadUrl);
}
}
});
},
/**
* 开启app更新进度监听
*/
appUpdateProgressListener() {
let that = this;
let options = {
cover: true,
sound: 'none',
title: '版本更新'
};
let intervalId = setInterval(function callBack() {
if (that.globalData.isUpdateApp) {
let content = '更新进度:' + that.globalData.updateProgress + '%';
plus.push.createMessage(content, 'appUpdate', options);
} else {
clearInterval(intervalId);
that.globalData.updateProgress = 0;
}
}, 500);
},