跳转到内容

更新

刀刀

12/30/2024

0 字

0 分钟

现有一个需求:客户想要点击 “检查更新” 按钮后判断当前是否是最新版本,不是最新版本则自动更新下载最新版本的 APP ,无需去到外部下载。

前置知识

plus 开头的方法是 APP 原生功能,是 5+Runtime 的内部对象,在普通浏览器运行plus api时控制台必然会输出 puls is not defined 错误提示。

详细的 runtime 方法与属性可查阅官方文档 runtime

plus.runtime.getProperty

拿到的是当前应用的版本,如果热更新过就是热更新的版本。其接收两个参数:

  • 参数一:应用的 Appid (必传)。
  • 参数二:获得应用信息成功回调函数(必传)。

示例代码:

js
const getAppInfo = () => {
	plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
		//appid属性
		var wgtStr = "appid:"+wgtinfo.appid;
		//version属性
		wgtStr += "<br/>version:"+wgtinfo.version;
		//name属性
		wgtStr += "<br/>name:"+wgtinfo.name;
		//description属性
		wgtStr += "<br/>description:"+wgtinfo.description;
		//author属性
		wgtStr += "<br/>author:"+wgtinfo.author;
		//email属性
		wgtStr += "<br/>email:"+wgtinfo.email;
		//features 属性
		wgtStr += "<br/>features:"+wgtinfo.features;
		console.log( wgtStr );
	} );
}

回调函数的参数中 version 属性是我们需要的版本号;name 属性是我们需要的应用名称。

注意

plus.runtime.version 也能获取版本号,二者不同之处在于 plus.runtime.version 获取到的是 manifest.json 中设置的 apk/ipa 版本号,整包更新的版本。

install

安装应用的方法,其接收四个参数:

  • 参数一:要安装的文件路径,支持应用资源安装包(wgt)、应用资源差量升级包(wgtu)、系统程序包(apk)(必传)。
  • 参数二:应用安装设置的参数(选传)。
  • 参数三:正确安装后的回调(选传)。
  • 参数四:安装失败的回调(选传)。
js
plus.runtime.install(
	//安装软件
	软件的下载地址, {
		force: true
	},
    // 成功回调
	function(res) {
		plus.runtime.restart();
	}
);

restart

重启当前的应用。

js
plus.runtime.restart();

应用热重启,重新启动进入首页。

quit

退出应用。

js
plus.runtime.quit();

实现思路

  • 前端可以获取到当前用户的版本号信息,通过调用接口获取服务器最新的版本号信息
  • 对比二者的版本号,如果当前版本低于最新版本,则根据后端返回的下载地址下载安装包
  • 安装完后热重启应用

代码实现

js
// 检测版本更新
const checkUpdates = async () => {
	// #ifdef APP-PLUS
	//调用接口获取后台版本信息,检查是否需要更新
	const versionInfo = await getAppInfo();
	console.log('获取后台版本信息', versionInfo);
	// 待更新版本
	const currentVersion = versionInfo.result.versionName;
	console.log('后台需要更新版本', currentVersion);
	// 更新地址
	let androidUrl = 后端返回的地址;
	
	//  比较版本是否不同 当前版本:plus.runtime.version
	const localVersion = version.value.split('.');
	const current = currentVersion.split('.');
	// 默认是同一个版本,不需要更新
	let flag = false;
	current.forEach((item, i) => {
		if (parseInt(item) > parseInt(localVersion[i])) {
			// 检测到版本不同,需要更新
			flag = true;
		}
	});

	if (flag) {
		uni.showModal({
			// 更新提醒
			title: '发现新版本,是否更新',
			content: '待更新版本号:' + currentVersion,
			// showCancel: showCancel,
			success: res => {
				if (res.confirm) {
					doUpData(androidUrl);
				} else if (res.cancel) {
					// 不更新强制退出app
					// if (showCancel) {
					// 	console.log('不更新强制退出app');
					// 	plus.runtime.quit();
					// }
				}
			}
		});
	} else {
		uni.showToast({
			title: '当前已是最新版本',
			icon: 'none'
		})
	}
	// #endif
}
const doUpData = (Url) => {
	uni.showLoading({
		title: '更新中……'
	});
	const downloadTask = uni.downloadFile({
		//执行下载
		url: Url, //下载地址
		timeout: 1000 * 30, //30秒超时时间
		success: downloadResult => {
			//下载成功
			console.log(downloadResult);
			uni.hideLoading();
			if (downloadResult.statusCode == 200) {
				plus.runtime.install(
					//安装软件
					downloadResult.tempFilePath, {
						force: true
					},
					function(res) {
						plus.runtime.restart();
					}
				);
			}
		},
		complete: com => {
			uni.hideLoading();
		}
	});
}