uni-app小程序版本更新

......

Posted by 呆贝斯 on June 9, 2021

前言

项目已上线运行,版本更新在所难免。小程序更新机制下,最坏要24小时才能更新到最新版。作为开发者,总是希望用户打开的小程序都是最新的,如何立刻更新最新版小程序呢?。

小程序更新机制

开发者在管理后台发布新版本的小程序之后,微信客户端会有若干个时机去检查本地缓存的小程序有没有新版本,并进行小程序的代码包更新。但如果用户本地有小程序的历史版本,此时打开的可能还是旧版本。

  1. 启动时同步更新 在以下情况下,小程序启动时会同步更新代码包。同步更新会阻塞小程序的启动流程,影响小程序的启动耗时。如果更新失败或超时,为了保障小程序的可用性,还是会使用本地版本打开。

    • 定期检查发现版本更新微信运行时,会定期检查最近使用的小程序是否有更新。如果有更新,下次小程序启动时会同步进行更新,更新到最新版本后再打开小程序,尽可能保证用户能够尽快使用小程序的最新版本。 总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内覆盖绝大多数用户。
    • 用户长时间未使用小程序用户长时间未使用小程序时,为保障小程序版本的实时性,会强制同步检查版本更新,更新到最新版本后再打开小程序。
  2. 启动时异步更新 即使启动前未发现更新,小程序每次冷启动时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包。 但当次启动仍会使用客户端本地的旧版本代码,即新版本的小程序需要等下一次冷启动才会使用。
  3. 开发者手动触发更新 在启动时异步更新的情况下,如果开发者希望立刻进行版本更新,可以使用 wx.getUpdateManager API 进行处理。 在有新版本时提示用户重启小程序更新新版本。

    const updateManager = wx.getUpdateManager()
    
    updateManager.onCheckForUpdate(function (res) {
          // 请求完新版本信息的回调
          console.log(res.hasUpdate)
    })
    
    updateManager.onUpdateReady(function () {
       wx.showModal({
             title: '更新提示',
             content: '新版本已经准备好,是否重启应用?',
             success(res) {
                if (res.confirm) {
                   // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
                   updateManager.applyUpdate()
                }
             }
          })
    })
    
    updateManager.onUpdateFailed(function () {
       // 新版本下载失败
    })
    

知识点

  1. 当用户点击左上角关闭,或者离开微信,小程序并没有直接销毁,而是进入了后台;当再次进入小程序,又会从后台进入前台,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被真正的销毁。
  2. 小程序的启动分为”冷启动” 和 “热启动”。

    • 热启动是指: 小程序打开后,在一段时间内(目前:5分钟)再次被打开,此时会将后台的小程序切换到前台。
    • 冷启动是指: 小程序首次打开或销毁后再次被打开。
  3. 冷启动时, 如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。

解决办法