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

前言

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

小程序的運行機制

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

生命週期

小程序的啓動

廣義的小程序啓動可以分爲兩種情況,一種是冷啓動,一種是熱啓動

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

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

前臺與後臺

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

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

  • 點擊右上角膠囊按鈕離開小程序
  • 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: '當前微信版本過低,無法使用該功能,請升級到最新微信版本後重試。',
      });
    }

因爲小程序的開發版和體驗版沒有版本的概念,所以無法在開發版和體驗版上測試更版本更新情況,但可以通過微信開發者工具 => 添加編譯模式 => 編譯設置 => 下次編譯時模擬更新來進行調試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章