關於小程式如何做到強制更新

前端南玖發表於2024-03-14

前言

在小程式的日常迭代中,有一些場景我們可能需要在小程式釋出後,使用者能夠馬上感知並更新,比如上線新活動、修復高危漏洞等,如果使用者因為各種原因未能及時更新小程式,這就可能導致一些功能無法正常使用或者存在安全隱患,因此,實現小程式的強制更新功能就顯得尤為重要。本文將探討小程式如何做到強制更新,以確保使用者始終使用最新、最安全的小程式版本。

小程式的執行機制

在這之前,我們得先來了解一下小程式的生命週期,從啟動到銷燬它都是如何進行的

生命週期

小程式的啟動

廣義的小程式啟動可以分為兩種情況,一種是冷啟動,一種是熱啟動

從小程式生命週期的角度來看,我們一般講的「啟動」專指冷啟動,熱啟動一般被稱為後臺切前臺。

  • 冷啟動:如果使用者首次開啟,或小程式銷燬後被使用者再次開啟,此時小程式需要重新載入啟動,即冷啟動。
  • 熱啟動:如果使用者已經開啟過某小程式,然後在一定時間內再次開啟該小程式,此時小程式並未被銷燬,只是從後臺狀態進入前臺狀態,這個過程就是熱啟動。

前臺與後臺

  • 前臺:小程式的「前臺」狀態一般指的是小程式處於開啟狀態,頁面正在展示給使用者
  • 後臺:當使用者關閉小程式時小程式並沒有真正被關閉,而是進入了「後臺」狀態

切後臺的方式包括但不限於以下幾種:

  • 點選右上角膠囊按鈕離開小程式
  • iOS 從螢幕左側右滑離開小程式
  • 安卓點選返回鍵離開小程式
  • 小程式前臺執行時直接把微信切後臺(手勢或 Home 鍵)
  • 小程式前臺執行時直接鎖屏

掛起

小程式進入「後臺」狀態一段時間後(目前是 5 秒),微信會停止小程式 JS 執行緒的執行,小程式進入「掛起」狀態。此時小程式的記憶體狀態會被保留,但開發者程式碼執行會停止,事件和介面回撥會在小程式再次進入「前臺」時觸發。

當開發者使用了後臺音樂播放後臺地理位置等能力時,小程式可以在「後臺」持續執行,不會進入到「掛起」狀態

銷燬

當小程式進入後臺或被掛起時,它並不會一直保留在後臺,當滿足以下兩點時,小程式會被銷燬

  • 當小程式進入後臺並被「掛起」後,如果很長時間(目前是 30 分鐘)都未再次進入前臺,小程式會被銷燬。
  • 當小程式佔用系統資源過高,可能會被系統銷燬或被微信客戶端主動回收。

小程式的更新機制

小程式預設的更新機制可以分為兩類:啟動時同步更新啟動時非同步更新

啟動時同步更新

在以下情況下,小程式啟動時會同步更新程式碼包。同步更新會阻塞小程式的啟動流程,影響小程式的啟動耗時。

  • 定期檢查發現版本更新,微信執行時定時檢查下載更新,如果有更新,下次小程式啟動時會同步進行更新,更新到最新版本後再開啟小程式
  • 使用者長時間未使用小程式,會強制同步更新

啟動時非同步更新

  • 即使啟動前未發現更新,小程式每次冷啟動時,都會非同步檢查是否有更新版本。如果發現有新版本,將會非同步下載新版本的程式碼包。但當次啟動仍會使用客戶端本地的舊版本程式碼,即新版本的小程式需要等下一次冷啟動才會使用

強制更新

在啟動時非同步更新的情況下,如果開發者希望立刻進行版本更新,可以使用 wx.getUpdateManagerAPI 進行處理,該API會返回一個UpdateManager例項

UpdateManager 物件為小程式提供了四種關鍵的方法,用於管理和監控小程式的更新過程。

  • UpdateManager.applyUpdate():在小程式新版本已經下載完成的情況下(即接收到 onUpdateReady 回撥後),此方法用於強制小程式重啟並啟用新版本。

  • UpdateManager.onCheckForUpdate(function callback):此方法用於監聽向微信後臺發起的更新檢查結果事件。微信小程式在冷啟動時會自動進行更新檢查,開發者無需主動觸發。

  • UpdateManager.onUpdateReady(function callback):此方法用於監聽小程式的新版本更新就緒事件。一旦新版本可用,客戶端會自動觸發下載過程(無需開發者額外操作),並在下載成功後呼叫此回撥函式。

  • UpdateManager.onUpdateFailed(function callback):此方法用於監聽小程式更新失敗的事件。當小程式有新版本且客戶端嘗試自動下載更新時(同樣無需開發者干預),如果因網路問題或其他原因導致下載失敗,將會觸發此回撥函式。

根據以上API,我們就能夠在小程式法版後,通知使用者進行強制更新

if (taro.canIUse('getUpdateManager')) {
      const updateManager = taro.getUpdateManager();
      updateManager.onCheckForUpdate(function (res) {
        console.log('onCheckForUpdate====', res);
        if (res.hasUpdate) {
          // 小程式已更新
          updateManager.onUpdateReady(function () {
            taro.showModal({
              title: '更新提示',
              showCancel: false,
              confirmText: '立即重啟',
              content: '新版本已經上線,是否重啟小程式以應用新版本?',
              success: function (res) {
                if (res.confirm) {
                  // 呼叫 applyUpdate 應用新版本並重啟
                  updateManager.applyUpdate();
                }
              }
            });
          });
          // 更新失敗
          updateManager.onUpdateFailed(function () {
            taro.showModal({
              title: '更新失敗',
              content: '新版本下載失敗,請刪除當前小程式後重新開啟。',
            });
          });
        }
      });
    } else {
      // 版本過低
      taro.showModal({
        title: '提示',
        content: '當前微信版本過低,無法使用該功能,請升級到最新微信版本後重試。',
      });
    }

因為小程式的開發版和體驗版沒有版本的概念,所以無法在開發版和體驗版上測試更版本更新情況,但可以透過微信開發者工具 => 新增編譯模式 => 編譯設定 => 下次編譯時模擬更新來進行除錯

相關文章