UniApp应用更新方案
两种更新方式
- APP全量升级:需要重新下载安装包
- 热更新:通过下载wgt资源包实现,用户只需重启应用
Android更新实现
用户需要授权安装权限,流程为下载APK后自动弹出安装界面
javascript
var dtask = plus.downloader.createDownload("APK下载地址", {
method: "GET"
}, (d, status) => {
if (status == 200) {
console.log("下载成功安装: " + d.filename);
plus.runtime.install(d.filename)
} else {
plus.nativeUI.alert("安装失败,请稍候重试: " + status)
}
});
this.downloading = true
dtask.addEventListener('statechanged', (e) => {
// 下载进度监听
this.downloadedSize = (e.downloadedSize / 1000000).toFixed(1)
this.packageFileSize = (e.totalSize / 1000000).toFixed(1)
this.downLoadPercent = (e.downloadedSize / e.totalSize * 100).toFixed(0)
});
dtask.start();
iOS更新实现
直接跳转至App Store
javascript
plus.runtime.openURL("appStore地址");
热更新实现步骤
-
修改版本号
更新manifest.json中的版本号(如从1.0.0升级到1.0.1或1.1.0)
-
生成升级包
在HBuilderX中:菜单->发行->原生App-制作移动App资源升级包(wgt)
-
部署更新
将wgt包上传至服务器,在代码中实现版本检测和更新逻辑
javascript
uni.downloadFile({
url: "wgt地址",
success: (downloadResult) => {
uni.showLoading({
title: '更新中'
})
if (downloadResult.statusCode === 200) {
uni.hideLoading();
plus.runtime.install(downloadResult.tempFilePath, {
force: true // 是否强制更新
}, function() {
console.log('install success...');
setTimeout(() => {
plus.runtime.restart();
}, 0)
}, function(e) {
console.error(e);
});
} else {
console.error('download fail...');
}
}
});
注意事项
- 开发阶段使用HBuilder应用信息,需打包自定义基座或正式包测试
- 使用
plus.runtime.getProperty()
获取manifest版本信息而非plus.runtime.version
- 安装wgt包后必须调用
plus.runtime.restart()
使更新生效 - 使用条件编译限定仅在App平台执行更新逻辑