微信小程序更新机制

365 阅读4分钟

在了解微信小程序的更新机制之前,我们要先知道冷启动热启动的概念。当你第一次打开某个小程序或者你打开的小程序进程被销毁了再重新打开,这种便是冷启动了。热启动是指你已经打开了小程序,退出到后台,在小程序还没被销毁之前再次打开,这个时候小程序没有一个加载的过程,你刚刚打开的页面、滚动到的位置,都会原原本本呈现出来。

在了解了小程序的冷启动以及热启动概念之后,进入我们今天的主题,微信小程序的更新机制。

严格来说,小程序的更新取决于他的宿主环境也就是微信客户端。我们都知道小程序有个打包上传的过程,被上传的地方我们统称为微信服务器。微信服务器中保存着对应小程序的所有版本,当我们第一次打开某个小程序时,客户端会向微信服务器请求对应的小程序包,微信服务器收到请求后返回最新版本的小程序包,紧接着客户端就可以运行此小程序了,并将这个包保存到微信中(当然,对于微信是否将所有小程序包、永远保存于客户端,这个就不得而知了,它应该有自己的优化机制)。这也就是为什么微信小程序二次打开都很快了,因为源码就在本地。所以只要是第一次打开小程序,获得的肯定是最新版本的小程序。

上面是第一种情况,第二种则是已经访问过小程序了,这个时候就用上我们开头说的冷启动和热启动了。首先,不管是冷启动还是热启动,微信客户端都会问问微信服务器当前小程序是否有新的版本,如果有也不会影响本次打开,当下用的还是非最新版本,但是微信客户端会在后台为我们下载好新版的小程序,等待下一次的冷启动替换为最新版。也许你会问为什么是下一次冷启动的时候进行版本替换呢,而不是下载完马上替换,亦或者热启动的时候替换?这样做会打断用户当前的操作,进而影响了用户体验,你总不会想在表单快填完的时候给你更新掉了吧,我想你会抓狂的。当用户进行冷启动时,微信客户端会先看看当前是否有下载好的最新版本小程序进行替换,如果有则用最新的版本启动,当然它还是会照例问问服务器是否有比当前所打开的版本还更新的呢。

虽然版本更新的主动权被微信客户端把持着,但是我们可以想办法加快更新的流程。在客户端下载好最新版小程序后,我们可以强制让用户更新,而不用等到下一次冷启动,但是我们一般不这么做,往往都是询问用户是否需要马上更新最新版本(除非有些版本我们希望用户马上能够更新体验)。一般的做法则是通过后台配置当前所发的版本是否需要强制用户更新,进而达到灵活控制的效果,虽然我们现在可以加快用户更新的流程了,但是如果客户端和微信服务器的交互有任何问题的话我们也是无可奈何的🤷

下面就是一般的执行流程了,可以封装好,在每次小程序热启动,也就是从后台进入前台的时候,触发App.onShow事件的时候进行检查,当然这个的触发条件是后台配置需要强制更新时,不然就让微信客户端全程处理就行了

// 获取更新管理器
const updateManager = wx.getUpdateManager();
// 监听向微信后台请求检查更新结果事件。微信在小程序每次启动(包括热启动)时自动检查更新,不需由开发者主动触发。
updateManager.onCheckForUpdate(function (result) {
  if (result.hasUpdate) {
    // 如果监听到有新版本了,微信会自动帮我们下载最新版的
    updateManager.onUpdateReady(function () {
      // 新的版本已经下载好
      wx.showModal({
        title: '更新提示',
        content: '新版本已经下载好,请重启应用。',
        showCancel: false,
        success: function () {
          // 强制小程序重启并使用新版本。
          updateManager.applyUpdate();
        }
      });
    });
    // 监听新版本下载失败
    updateManager.onUpdateFailed(function () {
      wx.showModal({
        title: '已经有新版本了哟~',
        content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~'
      });
    });
  }
});

以上就是本文的所有内容了,最近产品总是问和小程序更新相关的问题,在这将自己思考的过程记录下,如果大家有更好的想法,非常欢迎大家提出建议~