背景
小程序每次发版更新,都需要反复的删除打开或清除缓存,以获取最新版本。更新的不及时导致不同用户查看的版本不同(有些用户会报Bug、测试也不方便验证新版本)。
方案
手动更新:由用户选择是否更新,如不更新,则不影响用户当前操作,但后台仍会异步更新
- 《优先使用本地版本设置》为是
- wx.getUpdateManager()
强制更新:保证用户使用最新版本,但强制下载新版,用户必须等待,也许他不关心新版
- 《优先使用本地版本设置》为否
- 《小程序最低可用版本》选择最新发布的版本
结论:因为小程序的强制更新只需修改后台配置,所以两种方案都要,代码上只用实现手动更新。当此次更新是破坏性的(严重 Bug 修复、模块大改等),就到后台配置强制更新。
实现
在《我的》页面增加「更新提示」(只在需要更新时显示),点击更新版本。
app.js
js
App({
globalData: {
needUpdate: false,
uploadDownloadFail: false,
},
// 监测是否有版本更新
watchUpdate() {
const updateManager = wx.getUpdateManager()
updateManager.onUpdateReady(() => {
// 有更新
this.globalData.needUpdate = true
})
updateManager.onUpdateFailed(() => {
// 有更新,但下载失败
this.globalData.needUpdate = true
this.globalData.uploadDownloadFail = true
})
},
onLaunch(options) {
this.watchUpdate()
},
})
mine.js
js
<view wx:if="{{ needUpdate }}" bind:tap="updateVersion">存在新版本,点击升级</view>
===============================================================
Page({
/**
* 页面的初始数据
*/
data: {
needUpdate: false,
uploadDownloadFail: false,
},
// 同步 app.js 中的 needUpdate、uploadDownloadFail 变量值
// 注意:每次都调用 getApp() 以获取最新值
watchUpdate() {
this.setData({
needUpdate: getApp().globalData.needUpdate,
uploadDownloadFail: getApp().globalData.uploadDownloadFail,
})
setInterval(() => {
this.setData({
needUpdate: getApp().globalData.needUpdate,
uploadDownloadFail: getApp().globalData.uploadDownloadFail,
})
}, 5000)
},
// 更新版本
updateVersion() {
const { uploadDownloadFail } = this.data
if (!uploadDownloadFail) {
// 新版本下载成功
wx.showModal({
title: '更新提示',
content: '新版本已经准备好,是否重启应用?',
success: (res) => {
if (res.confirm) {
// 应用新版本并重启
const updateManager = wx.getUpdateManager()
updateManager.applyUpdate()
}
}
})
} else {
// 新版本下载失败
// wx.showToast({
// title: '新版本下载失败,请您尝试删除当前小程序,重新搜索打开!',
// icon: 'none',
// duration: 8000
// })
wx.restartMiniProgram({
path: '/pages/index/index'
})
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.watchUpdate()
},
})
可扩展:
- 显示版本号:wx.getAccountInfoSync().miniProgram.version
- 增加更新公告,说明更新内容
最后
参考文章:
欢迎沟通交流。