# 小程序更新机制

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

## 启动时同步更新

在以下情况下，小程序启动时会同步更新代码包。同步更新会阻塞小程序的启动流程，影响小程序的启动耗时。

### 定期检查发现版本更新

微信运行时，会定期检查最近使用的小程序是否有更新。如果有更新，下次小程序启动时会同步进行更新，更新到最新版本后再打开小程序，尽可能保证用户能够尽快使用小程序的最新版本。

若因网络情况较差等原因导致更新失败，仍会启动本地的较低版本。

### 用户长时间未使用小程序

用户长时间未使用小程序时，为保障小程序版本的实时性，会强制同步检查版本更新，更新到最新版本后再打开小程序。

若因网络情况较差等原因导致更新失败，仍会启动本地的较低版本。

## 启动时异步更新

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

### 手动触发更新

在启动时异步更新的情况下，如果希望立刻进行版本更新，可以使用 [wx.getUpdateManager](/miniprogram/dev/api/base/update/UpdateManager.md) API，在有新版本时提示用户重启小程序更新新版本。

```js
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 () {
  // 新版本下载失败
})
```

## 小程序管理后台的相关设置

### 优先使用本地版本设置

若某些较新的小程序版本无需强制用户同步更新到最新版本，可以在小程序管理后台「设置」-「版本设置」-「优先使用本地版本设置」中进行设置。设置后若同步更新时检查本地版本不低于该版本，则优先使用本地版本，同时将会异步下载最新版本的代码包。

### 小程序最低可用版本设置

若某些较旧的小程序版本服务不再可用，可以在小程序管理后台「设置」-「版本设置」-「小程序最低可用版本设置」中进行设置。设置后若同步更新时检查本地版本低于该版本，则无法打开，并继续尝试下载最新版本；若异步更新，则会在检查到更新后提示用户重启小程序更新到新版本。

## 注意

* 在后台发布新版本之后，无法立刻影响到所有现网用户；正常情况下，在全量发布 24 小时之后，新版本可以覆盖 99% 以上的用户。
* 小程序管理后台的「优先使用本地版本设置」和「小程序最低可用版本设置」不会影响同步更新与异步更新的选择。
