官方的热更新升级方案中是支持静默更新的,但是静默更新如果不重启常常会有页面样式错乱、数据加载错误等问题,看组件源码我们可以发现下载完成后是立即执行了wgt安装的操作,此时不重启app就会导致以上问题,这里我的思路是想在app在后台时执行安装并重启,或者在下次打开时执行安装并重启。
方案一、应用置于后台运行时安装热更新包并重启。
优点:更新会比较及时,只要应用置于后台了就会执行更新;
缺点:用户返回app时会执行安装重启,此时有明显的重启操作(安装完之后,我的wgt包20M需等3秒左右会重启),重启后会回到首页,这里可以记录重启前的页面,重启后重新定位该页面。
方案二、应用完全退出后重启时安装热更新包并再次重启。
优点:用户不会感觉到很明显的重启操作,不影响用户正常操作;
缺点:第一次启动时会有较长的时间停留在启动页(wgt包20M会停留在启动页7秒左右)安装完的重启几乎无感,很快,当然我们可以制作一个nvue的前端页面来代替启动页,并在这个页面用文字提示用户正在加载资源什么的(类似游戏打开先检查一番资源),获取用户信任,否则长时间的停留在启动页容易让用户误以为是app卡死。
主要的代码部分
uni-upgrade-center-app/utils/check-update.ts
// 静默更新,只有wgt有
if (uniUpgradeCenterResult.is_silently) {
uni.downloadFile({
url,
success: res => {
if (res.statusCode == 200) {
uni.setStorageSync('WGTFilePath', res.tempFilePath)
// 下载好直接安装,下次启动生效
// plus.runtime.install(res.tempFilePath, {
// force: false
// });
}
}
});
return;
}
保存wgt包的文件路径
App.vue
方案一:
onHide: function() {
let WGTFilePath = uni.getStorageSync('WGTFilePath')
if (WGTFilePath)
plus.runtime.install(WGTFilePath, {
force: false
}, () => {
uni.setStorageSync('WGTFilePath', '')
plus.runtime.restart()
return
})
},
方案二:
onLaunch: function() {
let WGTFilePath = uni.getStorageSync('WGTFilePath')
if (WGTFilePath)
plus.runtime.install(WGTFilePath, {
force: false
}, () => {
uni.setStorageSync('WGTFilePath', '')
plus.runtime.restart()
return
})
},
onShow: function() {
let WGTFilePath = uni.getStorageSync('WGTFilePath')
if (!WGTFilePath)//手动关闭启动页
plus.navigator.closeSplashscreen()
},
需要在配置文件关闭自动关闭启动页,并在app.vue手动处理
"splashscreen" : {
"alwaysShowBeforeRender" : false,
"waiting" : false,
"autoclose" : false,
"delay" : 0
},
0 个评论
要回复文章请先登录或注册