PHP前端开发

介绍 uni-app在线升级和热更新实现

百变鹏仔 4周前 (11-20) #uniapp
文章标签 在线升级

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