冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。
热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。
从小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。
小程序更新机制:
- 启动时同步更新:
a. 定期检查发现版本更新,微信运行时定时检查下载更新
b. 用户长时间未使用小程序,会强制同步更新
- 启动时异步更新
即使启动前未发现更新,小程序每次冷启动时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包。但当次启动仍会使用客户端本地的旧版本代码,即新版本的小程序需要等下一次冷启动才会使用。
- 开发者手动触发更新
/**
* 小程序强制更新处理
*/
export default class ForceUpdate {
// 检查更新
checkForUpdate () {
// 获取小程序更新机制兼容
if (wx.canIUse('getUpdateManager')) {
const updateManager = wx.getUpdateManager()
// 1. 检查小程序是否有新版本发布
updateManager.onCheckForUpdate((res) => {
console.log('onCheckForUpdate:', res)
// 请求完新版本信息的回调
if (res.hasUpdate) {
// 检测到新版本,需要更新,给出提示
wx.showModal({
title: '更新提示',
content: '检测到新版本,是否下载新版本并重启小程序?',
confirmText: '确定',
success: (modalRes) => {
if (modalRes.confirm) {
// 2. 用户确定下载更新小程序,小程序下载及更新静默进行
this.downLoadAndUpdate(updateManager)
}
}
});
}
})
}
}
// 下载小程序新版本并重启应用
downLoadAndUpdate (updateManager) {
wx.showLoading({
title: '下载中',
mask: true
});
// 静默下载更新小程序新版本
updateManager.onUpdateReady(function () {
console.log('更新包下载完成')
wx.hideLoading()
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
})
updateManager.onUpdateFailed(function () {
console.log('更新包下载失败')
wx.hideLoading()
// 新的版本下载失败
wx.showModal({
title: '更新提示',
content: '新版本已上线,请您删除当前小程序,重新搜索打开。',
showCancel: false,
confirmText: '确定'
});
})
}
}
这种方式只能解决冷启动的强制更新,热启动时,还是走的旧版本,如果也想解决热更新的强制更新,估计得后端维护一个前端版本号,每次发布需要更新前端版本号,前端通过接口请求获取后端记录的最新版本号,如果当前小程序版本小于最新版本,则执行强制更新流程。