(3)強制更新官方版
背景
此前有開發者反饋小程序發布新版本后,新版本覆蓋率比較慢,因為小程序的更新機制是異步的,部分用戶不會馬上應用上新版本。
小程序啟動會有兩種情況,一種是「冷啟動」,一種是「熱啟動」。 假如用戶已經打開過某小程序,然后在一定時間內再次打開該小程序,此時無需重新啟動,只需將后台態的小程序切換到前台,這個過程就是熱啟動;冷啟動指的是用戶首次打開或小程序被微信主動銷毀后再次打開的情況,此時小程序需要重新加載啟動。
小程序的異步更新發生在冷啟動過程,當發現新版本后,會異步下載新版本的代碼包,但不會馬上應用上最新版本,需要等小程序下一次冷啟動,才會應用上新版本。
解決思路
為了解決這個問題,我們內部也經歷了數個方案的討論,這里簡單介紹下:
1. 同步檢查更新(放棄):可能是最直接的解決思路,但主要問題是會影響小程序的啟動速度,當下小程序的更新迭代是非常頻繁的,部分用戶可能每次啟動都命中更新,如果需要同步檢查更新+同步下載新的版本,那將會影響這部分用戶的啟動體驗。
2. 模塊熱替換(放棄):從技術上來說,這是最好的方案,小程序運行起來后,在打開新頁面時,馬上應用新版本里的頁面,但這就會存在新舊邏輯、頁面共存問題,對於開發者來說,反而更不好處理,特別是涉及到全局變量時,情況會更復雜,對於我們已有的框架來說,也是一個大挑戰,不過這個也是我們之后努力的方向。
3. 定時 check 新版本(目前方案):6.6.3 及以上版本的客戶端,會定時 check 最近使用過的小程序是否有發布新版本;如果有,下次打開的時候會同步更新新版本再打開。這可以保證在新版本發布 24 小時后,所有小程序都能使用最新版本。(這部分是微信客戶端自身優化,開發者無需關心)
4. 異步更新 + 強制更新(目前方案):同步檢查更新與模塊熱替換兩者之間的折衷方案,即還是維持異步更新機制,在異步下載完小程序代碼包后,提供重啟小程序的能力,這樣在遇到緊急問題時可以馬上解決。
異步更新 + 強制更新方案介紹
從基礎庫 1.9.90 開始,我們提供了 wx.getUpdateManager 接口,使用該接口,可以獲知是否有新版本小程序、新版本是否下載好以及應用新版本的能力。
當小程序冷啟動時,會自動向微信后台請求新版本信息,如果有新版本,會馬上觸發新版本的下載。開發者可以通過 wx.getUpdateManager,獲知當前更新的狀態。
wx.getUpdateManager 接口會返回一個 UpdateManager 實例,UpdateManager 包含了三個回調:
1. onCheckForUpdate:當小程序向后台請求完新版本信息,會通知這個版本告知檢查結果
2. onUpdateReady:當新版本下載完成,會回調這個事件
3. onUpdateFailed: 當新版本下載失敗,會回調這個事件
還有重啟應用新版本的接口:
1. applyUpdate:當新版本下載完成(onUpdateReady),調用該方法會強制當前小程序應用上新版本並重啟
具體示例:
// wx.getUpdateManager 在 1.9.90 才可用,請注意兼容
const updateManager = wx.getUpdateManager()
updateManager.onCheckForUpdate(
function
(res) {
// 請求完新版本信息的回調
console.log(res.hasUpdate)
})
updateManager.onUpdateReady(
function
() {
wx.showModal({
title:
'更新提示'
,
content:
'新版本已經准備好,是否馬上重啟小程序?'
,
success:
function
(res) {
if
(res.confirm) {
// 新的版本已經下載好,調用 applyUpdate 應用新版本並重啟
updateManager.applyUpdate()
}
}
})
})
updateManager.onUpdateFailed(
function
() {
// 新的版本下載失敗
})
|
更詳細信息可以參考 UpdateManager 的詳細文檔
最佳實踐
從用戶體驗上來說,我們還是建議只在非常必要時才強制用戶重啟更新,例如出現線上緊急 BUG。通常情況下,可以選通過 wx.showModal 彈出選擇框讓用戶選擇是否重啟更新(實現請參考示例代碼)。
如何調試
最新版本的微信開發者工具提供了強制更新的調試能力,通過編譯模式 - 編輯編譯模式 - 勾上「下次編譯時模擬更新」即可在開發者工具上調試強制更新功能。
鏈接:https://developers.weixin.qq.com/community/develop/doc/000c2430d30b70251e86f0a0256c09