微信小程序版本更新机制

95 阅读4分钟

微信小程序运行机制

前台/后台状态

小程序启动后,界面被展示给用户,此时小程序处于前台状态 当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了后台状态,小程序还可以运行一小段时间 当用户再次进入微信或再次打开小程序,小程序又会从后台进入前台。但如果用户很久没有再进入小程序,或者系统资源紧张,小程序可能被销毁,即完全终止运行

小程序启动

小程序启动可以分为两种情况,一种是冷启动,一种是热启动

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

小程序销毁时机

通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁 具体而言包括以下几种情形:

  • 当小程序进入后台,可以维持一小段时间的运行状态,如果这段时间内都未进入前台,小程序会被销毁。
  • 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收

微信小程序更新机制

未启动时更新

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

启动时更新

小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上

API更新

如果需要马上应用最新版本,可以使用 wx.getUpdateManager API 进行处理

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

在小程序的app.js中使用 wx.getUpdateManager API 进行版本检查更新

app.js:
App({
  onLaunch() {
    //判断当前微信版本是否支持 getUpdateManager 接口
    if(wx.canIUse('getUpdateManager')) {
      //获取全局唯一的版本更新管理器,用于管理小程序更新
      const updateManager = wx.getUpdateManager()
      //监听向微信后台请求检查更新结果
      updateManager.onCheckForUpdate(function (res) {
        if(res.hasUpdate) {
          //监听小程序有版本更新
          updateManager.onUpdateReady(function () {
            wx.showModal({
              title: '更新提示',
              content: '新版本已经更新,是否重启小程序?',
              success: function (res) {
                if(res.confirm) {
                  //强制小程序重启并使用新版本
                  updateManager.applyUpdate()
                }
              }
            })
          })
          //监听小程序更新失败
          updateManager.onUpdateFailed(function () {
            wx.showModal({
              title: '更新提示',
              content: '新版本已经上线,请您删除当前小程序,重新搜索小程序打开'
            })
          })
        }
      })
    }else {
      wx.showModal({
        title: '更新提示',
        content: '当前微信版本过低,无法使用新版本,请升级到最新微信版本后重试'
      })
    }
  }
})