一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 7 天,点击查看活动详情。
前言
微信小程序在发布时可以选择全量发布和灰度发布,但是在发布时即使选择了全量发布,有部分用户打开的也不是最新的版本。这是因为打开微信小程序会有个缓存机制,当用户曾经打开过小程序,用户本地会缓存住代码包,虽然微信会有若干时机去更新本地的缓存,但是还是有一定几率打开的是旧版本。 即使启动前未检测到新版本,小程序在冷启动时也会去检查是否有新版本,但是这种方式是异步的,需要在小程序下次冷启动时候才会生效。所以我们要做的就是当异步检测到有新版本时,提示用户手动去更新。
冷启动:首次打开小程序,或者小程序被销毁后再次打开就是冷启动,销毁机制大概发生在小程序切入后台30分钟左右。
热启动:启动小程序后,在一定的时间内再次打开小程序,此时小程序未被销毁,只是从后台进入前台状态。
代码实现
依旧是先梳理一下流程图,借助微信小程序apigetUpdateManager
,我们可以轻松获得小程序的版本更新管理器。
我们可以将代码更新封装为单独的模块,在
app.js
onLaunch生命周期里调用这个模块。
const updateCode = (v) => {
if (wx.canIUse('getUpdateManager')) {
const updateManager = wx.getUpdateManager()
updateManager.onCheckForUpdate(res => {
if (res.hasUpdate) {
wx.showModal({
title: '更新提示',
content: '检测到新版本,是否下载新版本并重启小程序',
}).then(res => {
if (res.confirm) {
downLoad(updateManager)
} else if (res.cancel) {
// 如果用户取消更新,判断此版本是否是强制更新
isForced(v).then(res => {
if (res.isForced) {
// 需要强制更新
wx.showModal({
title: '提示',
content: '本次版本更新涉及到新功能的添加,旧版本将无法正常使用',
showCancel: false,
confirmText: '确认更新'
}).then(res => {
downLoad(updateManager)
})
}
})
}
})
}
})
} else {
wx.showModal({
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
})
}
}
const downLoad = (updateManager) => {
wx.showLoading()
updateManager.onUpdateReady(() => {
wx.hideLoading()
updateManager.applyUpdate()
})
updateManager.onUpdateFailed(() => {
wx.showModal({
title: '已有新版本',
content: '请删除当前小程序,重新搜索打开'
})
})
}
const isForced = (v) => {
return new Promise((resolve) => {
wx.request({
url: 'xxxxxxx',
data: {
verson: v
},
success: res => {
resolve(res.data)
}
})
})
}
module.exports = {
updateCode
}
另外,当我们版本有重大更新时,我们需要用户强制更新新版本,所以我在这里还借助了后端写的接口,我在小程序代码里维护了一个版本号,当用户拒绝更新时以及用户基础库版本太低时,根据用户本地版本去接口查询,当前版本是否有更新以及是否需要强制更新,然后给出用户更新或者强制更新的提醒。