小程序强制更新

  • 冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。

  • 热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。

从小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。

image

小程序更新机制:

  1. 启动时同步更新:

a. 定期检查发现版本更新,微信运行时定时检查下载更新

b. 用户长时间未使用小程序,会强制同步更新

  1. 启动时异步更新

即使启动前未发现更新,小程序每次冷启动时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包。但当次启动仍会使用客户端本地的旧版本代码,即新版本的小程序需要等下一次冷启动才会使用。

  1. 开发者手动触发更新
/**
 * 小程序强制更新处理
 */
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: '确定'
      });
    })
  }
}

这种方式只能解决冷启动的强制更新,热启动时,还是走的旧版本,如果也想解决热更新的强制更新,估计得后端维护一个前端版本号,每次发布需要更新前端版本号,前端通过接口请求获取后端记录的最新版本号,如果当前小程序版本小于最新版本,则执行强制更新流程。

参考文章:

  1. https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/update-mechanism.html

你可能感兴趣的:(小程序强制更新)