前言

首先先来说说为什么要进行版本更新和热更新;版本更新,毋庸置疑,我们所作的产品肯定会一直升级迭代的,不可能一直不升级,当版本升级完的时候我们会从新上架应用商场,但是很多用户是不去看这些的,因此当有重要版本更新的时候,我们其实希望用户打开 APP 就可以看到有新的版本更新;其次就是热更新,热更新就是在用户不知道的情况下进行更新,主要就是一些小更新或者 bug 的修复,这种情况我们不可能让用户为了我们一个小 bug 去应用商城从新下载,因此就需要用到热更新。

准备

首先在跟目录下创建一个 common 的目录存放一些工具函数,在common 下面创建一个名为 updataApp 的 js 文件,将下方代码直接粘贴到里面,也可以根据自身需求修改里面代码,在这个工具函数里面向外暴漏了一个方法 getAppVersion,到这里前期工作准备就绪,接下来就是如何使用。

// 下载最新的APP
const downloadApp = (appUrl, isHint) => {
	//下载最新版本APP
	if (isHint) {
		uni.showLoading({
			title: '下载中...',
			mask: true
		})
	}
	uni.downloadFile({
		url: appUrl,
		success: fileResult => {
			uni.hideLoading();
			if (isHint) {
				uni.showModal({
					content: '下载成功,是否现在重启APP并安装吗?',
					confirmText: '重启',
					success: function(modalResult) {
						if (modalResult.confirm) {
							plus.runtime.install(
								fileResult.tempFilePath, {
									force: true
								},
								function() {
									uni.showLoading({
										title: '更新成功,重启中...',
										mask: true
									})
									plus.runtime.restart();
								}
							)
						}
					}
				})
			} else {
				plus.runtime.install(fileResult.tempFilePath, {
					force: true
				})
			}
		},
		fail: err => {
			if (isHint) {
				uni.hideLoading();
				uni.showToast({
					title: '下载失败,请检查你的网络情况!',
					icon: 'none'
				})
			}
		}
	})
}
// 获取版本号对比是否需要更新
export const getAppVersion = (isHint = true, serveAppVersion = null, serveAppUrl = null) => {
	// 当前本地的PP版本号
	// 
	let currentAppVersion = null
	plus.runtime.getProperty(plus.runtime.appid, function(e) {
		currentAppVersion = Number(e.versionCode)
		if (serveAppVersion > currentAppVersion) {
			if (isHint) {
				uni.showModal({
					content: '当前有最新版本,是否要下载更新?',
					success: (res) => {
						if (res.confirm) {
							downloadApp(serveAppUrl, isHint)
						}
					}
				})
			} else {
				downloadApp(serveAppUrl, isHint)
			}
		}
	});
}

使用

// 首先先进行引入这个方法
import { getAppVersion } from "./updataApp.js"

// 接下来我们需要自己去请求接口拿到服务器上app的版本号和下载地址,在调用这个方法的时候传入进去
// 第一个参数可选值为true和false,true就是会有弹框提醒用户更新,false就是没有,可以用在热更新
// 第二个参数是通过请求接口拿到服务器上app的版本号
// 第三个是通过请求接口拿到服务器上app的下载地址
getAppVersion(isHint, serveAppVersion, serveAppUrl)

小结

到这里我们也就实现了 APP 的版本更新,使用起来也很简单;这里有一个注意点,就是只能在 APP 上面使用,因此我们在引入进来这个方法的时候,通过接口获取版本检测更新需要用到 uniapp 的条件编译,只在 APP 上进行显示,H5 以及其他情况不进行版本更新。