關于小程序如何做到強制更新
前言
在小程序的日常迭代中,有一些場景我們可能需要在小程序發布后,用戶能夠馬上感知并更新,比如上線新活動、修復高危漏洞等,如果用戶因為各種原因未能及時更新小程序,這就可能導致一些功能無法正常使用或者存在安全隱患,因此,實現小程序的強制更新功能就顯得尤為重要。本文將探討小程序如何做到強制更新,以確保用戶始終使用最新、最安全的小程序版本。
小程序的運行機制
在這之前,我們得先來了解一下小程序的生命周期,從啟動到銷毀它都是如何進行的
生命周期
小程序的啟動
廣義的小程序啟動可以分為兩種情況,一種是冷啟動,一種是熱啟動。
從小程序生命周期的角度來看,我們一般講的「啟動」專指冷啟動,熱啟動一般被稱為后臺切前臺。
- 冷啟動:如果用戶首次打開,或小程序銷毀后被用戶再次打開,此時小程序需要重新加載啟動,即冷啟動。
- 熱啟動:如果用戶已經打開過某小程序,然后在一定時間內再次打開該小程序,此時小程序并未被銷毀,只是從后臺狀態進入前臺狀態,這個過程就是熱啟動。
前臺與后臺
- 前臺:小程序的「前臺」狀態一般指的是小程序處于打開狀態,頁面正在展示給用戶
- 后臺:當用戶關閉小程序時小程序并沒有真正被關閉,而是進入了「后臺」狀態
切后臺的方式包括但不限于以下幾種:
- 點擊右上角膠囊按鈕離開小程序
- iOS 從屏幕左側右滑離開小程序
- 安卓點擊返回鍵離開小程序
- 小程序前臺運行時直接把微信切后臺(手勢或 Home 鍵)
- 小程序前臺運行時直接鎖屏
掛起
小程序進入「后臺」狀態一段時間后(目前是 5 秒),微信會停止小程序 JS 線程的執行,小程序進入「掛起」狀態。此時小程序的內存狀態會被保留,但開發者代碼執行會停止,事件和接口回調會在小程序再次進入「前臺」時觸發。
當開發者使用了后臺音樂播放、后臺地理位置等能力時,小程序可以在「后臺」持續運行,不會進入到「掛起」狀態
銷毀
當小程序進入后臺或被掛起時,它并不會一直保留在后臺,當滿足以下兩點時,小程序會被銷毀
- 當小程序進入后臺并被「掛起」后,如果很長時間(目前是 30 分鐘)都未再次進入前臺,小程序會被銷毀。
- 當小程序占用系統資源過高,可能會被系統銷毀或被微信客戶端主動回收。
小程序的更新機制
小程序默認的更新機制可以分為兩類:啟動時同步更新、啟動時異步更新
啟動時同步更新
在以下情況下,小程序啟動時會同步更新代碼包。同步更新會阻塞小程序的啟動流程,影響小程序的啟動耗時。
- 定期檢查發現版本更新,微信運行時定時檢查下載更新,如果有更新,下次小程序啟動時會同步進行更新,更新到最新版本后再打開小程序
- 用戶長時間未使用小程序,會強制同步更新
啟動時異步更新
- 即使啟動前未發現更新,小程序每次冷啟動時,都會異步檢查是否有更新版本。如果發現有新版本,將會異步下載新版本的代碼包。但當次啟動仍會使用客戶端本地的舊版本代碼,即新版本的小程序需要等下一次冷啟動才會使用
強制更新
在啟動時異步更新的情況下,如果開發者希望立刻進行版本更新,可以使用 wx.getUpdateManager
API 進行處理,該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: '當前微信版本過低,無法使用該功能,請升級到最新微信版本后重試。',
});
}
因為小程序的開發版和體驗版沒有版本的概念,所以無法在開發版和體驗版上測試更版本更新情況,但可以通過微信開發者工具 => 添加編譯模式 => 編譯設置 => 下次編譯時模擬更新來進行調試