介绍 uni-app在线升级和热更新实现
uniapp开发教程栏目分析app升级的业务
推荐(免费):uniapp开发教程
第一、分析APP升级的业务
1、每次打开APP需要在全局App.vue中去检测请求后台接口
2、对比版本号校验是否升级
3、识别是热更新还是在线升级,处理不同业务,热更新下载包使用官方api升级(按照实际接口返回字段判断)
4、识别是强制升级还是非强制升级 弹框提醒用户
5、识别是IOS还是Android升级 用户点击跳转升级
第二、编写代码
1、进入APP.vue onLaunch下
2、按照业务分析编写升级代码
//#ifdef APP-PLUS // APP检测更新 具体打包流程可以参考:https://ask.dcloud.net.cn/article/35667 plus.screen.lockOrientation('portrait-primary'); //竖屏正方向锁定 //获取是否热更新过 const updated = uni.getStorageSync('updated'); // 尝试读取storage if (updated.completed === true) { // 如果上次刚更新过 // 删除安装包及安装记录 console.log('安装记录被删除,更新成功'); uni.removeSavedFile({filePath: updated.packgePath,success: res => { uni.removeStorageSync('updated');} }); } else if (updated.completed === false) { uni.removeStorageSync('updated'); plus.runtime.install(updated.packgePath, {force: true }); uni.setStorage({key: 'updated',data: { completed: true, packgePath: updated.packgePath},success: res => { console.log('成功安装上次的更新,应用需要重启才能继续完成');} }); uni.showModal({title: '提示',content: '应用将重启以完成更新',showCancel: false,complete: () => { plus.runtime.restart();} }); } else { //获取当前系统版本信息 plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {//请求后台接口 解析数据 对比版本this.$Request.getT('/appinfo/').then(res => { res = res.data[0]; if (res.wgtUrl && widgetInfo.version {if (res.statusCode === 200) { // 保存下载的安装包 console.log('保存安装包'); uni.saveFile({tempFilePath: res.tempFilePath,success: res => { const packgePath = res.savedFilePath; // 保存更新记录到stroage,下次启动app时安装更新 uni.setStorage({ key: 'updated', data: { completed: false, packgePath: packgePath }, success: () => { console.log('成功保存记录'); } }); // 任务完成,关闭下载任务 console.log('任务完成,关闭下载任务,下一次启动应用时将安装更新'); downloadTask.abort(); downloadTask = null;} });} } }); } else { console.log('下载地址未准备,无法开启下载任务'); }} else { //不是热更新是在线更新 校验是否强制升级 if (res.method == 'true') { uni.showModal({ showCancel: false, confirmText: '立即更新', title: '发现新版本', content: res.des, success: res => {if (res.confirm) { this.$queue.showLoading('下载中...'); if (uni.getSystemInfoSync().platform == 'android') {uni.downloadFile({ url: androidLink, success: downloadResult => { if (downloadResult.statusCode === 200) { plus.runtime.install(downloadResult.tempFilePath, { force: false},d => { console.log('install success...'); plus.runtime.restart();},e => { console.error('install fail...');} ); } }}); } if (uni.getSystemInfoSync().platform == 'ios') {plus.runtime.openURL(iosLink, function(res) {}); }} else if (res.cancel) { console.log('取消');} } }); } else { uni.showModal({ title: '发现新版本', confirmText: '立即更新', cancelText: '下次更新', content: res.des, success: res => {if (res.confirm) { this.$queue.showLoading('下载中...'); if (uni.getSystemInfoSync().platform == 'android') {uni.downloadFile({ url: androidLink, success: downloadResult => { if (downloadResult.statusCode === 200) { plus.runtime.install(downloadResult.tempFilePath, { force: false},d => { console.log('install success...'); plus.runtime.restart();},e => { console.error('install fail...');} ); } }}); } if (uni.getSystemInfoSync().platform == 'ios') {plus.runtime.openURL(iosLink, function(res) {}); }} else if (res.cancel) { console.log('取消');} } }); }} }}); }); } //#endif