微信小程序版本更新

更新机制

小程序的更新分为两种情况,一种是未启动时更新,一种是启动时更新。

未启动时更新

  • 在发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。
  • 微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。
  • 总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。
  • 用户下次打开时会先更新最新版本再打开

启动时更新

  • 小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动。
  • 新版本的小程序需要等下一次冷启动才会应用上
  • 如果需要马上应用最新版本,可以使用wx.getUpdateManager进行处理。

强制更新

wx.getUpdateManager

  • wx.getUpdateManager(): 获取全局唯一的版本更新管理器,用于管理小程序更新,返回值是UpdateManager对象。
    • UpdateManager.onCheckForUpdate():监听向微信后台请求检查更新结果事件。微信在小程序冷启动时自动检查更新,不需由开发者主动触发。返回值是个布尔值hasUpdate
    • UpdateManager.onUpdateReady():监听小程序有版本更新事件。客户端主动触发下载(无需开发者触发),下载成功后回调。
    • UpdateManager.applyUpdate():强制小程序重启并使用新版本。在小程序新版本下载完成后(即收到onUpdateReady回调)调用。
    • UpdateManager.onUpdateFailed():监听小程序更新失败事件。小程序有新版本,客户端主动触发下载(无需开发者触发),下载失败(可能是网络原因等)后回调。

代码实现

  • 微信开发者工具上可以通过「编译模式」下的「下次编译模拟更新」开关来调试
  • 小程序开发版/体验版没有「版本」概念,所以无法在开发版/体验版上测试版本更新情况
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
}

参考链接

https://developers.weixin.qq.com/community/develop/doc/000c2430d30b70251e86f0a0256c09

https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81

https://juejin.cn/post/7092422366738776101

https://www.jinjin.link/2021/06/09/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%BA%E5%88%B6%E6%9B%B4%E6%96%B0%E5%85%A8%E8%A7%A3%E6%9E%90/

上一篇