我們都知道,微信小遊戲是有離線緩存的機制,也就是說如果這台手機之前玩過某個遊戲,再打開遊戲的時候是先加載啟動手機本地緩存住的代碼包,這個代碼包是舊的,之後才會在背景向微信伺服器下載下傳最新的代碼包。
我們會遇到這樣的需求,微信小遊戲上線後,新開發了一個功能或修複了一個重大Bug,想讓使用者打開遊戲的時候就下載下傳運作最新的代碼包,而不是運作舊的代碼包。
有沒有解決辦法呢?當然是有的!微信小遊戲提供了一個 api wx.getUpdateManager() 來解決這個問題
核心方法:
UpdateManager.onCheckForUpdate(function callback)
監聽該事件後微信向背景檢查更新結果完會回調callback方法,如果有更新的版本,回調參數裡hasUpdate屬性為true。微信在小程式冷啟動時自動檢查更新,不需由開發者主動觸發。
UpdateManager.onUpdateReady(function callback)
監聽該事件後微信下載下傳完新版的代碼包時會回調callback方法。用戶端主動觸發下載下傳(無需開發者觸發),下載下傳成功後回調
UpdateManager.applyUpdate()
在onUpdateReady下載下傳完新代碼包後調用該方法強制小程式重新開機并使用新版本。
下面上代碼:
if(window["wx"].getUpdateManager){
const updateManager = window["wx"].getUpdateManager()
updateManager.onCheckForUpdate(function (res) {
// 請求完新版本資訊的回調
if(res.hasUpdate){
//如果記憶體卡有存儲遊戲相關的離線檔案,在更新版本的時候需要清除,避免廢檔案越來越多
window["clearTempCache"] && window["clearTempCache"]();
window["wx"].showToast({icon:"none", title:"有新版本了,正在下載下傳中..", duration: 600000});//10分鐘
}
})
updateManager.onUpdateFailed(function () {
window["wx"].hideToast();
window["wx"].showModal({
content: '新版本下載下傳失敗了,點選确定重新開機遊戲',
title: '更新提示',
showCancel: false,
success: function (res) {
window["wx"].exitMiniProgram();
}
})
})
updateManager.onUpdateReady(function () {
window["wx"].hideToast();
window["wx"].showModal({
content: '新版本已經準備好了,點選确定重新開機應用',
title: '更新提示',
showCancel: false,
success: function (res) {
if (res.confirm) {
// 新的版本已經下載下傳好,調用 applyUpdate 應用新版本并重新開機
updateManager.applyUpdate()
}
}
})
})
}
特别注意:
- 微信小遊戲基礎庫 需要1.9.90以上版本才支援。針對老版本用戶端需要做好相容。
- 該更新機制隻是在遊戲冷啟動的時候會觸發,熱啟動的時候是不會進行更新判斷的。冷熱啟動機制詳細介紹 請看這裡
- 微信開發者工具上可以通過「編譯模式」下的「下次編譯模拟更新」開關來調試。
- 小程式開發版/體驗版沒有「版本」概念,是以無法在開發版/體驗版上測試更版本更新情況,隻能在正式版線上驗證。
- 位元組小遊戲、QQ小遊戲、百度小遊戲的更新機制和微信小遊戲是一樣的,故以上代碼完全支援這幾個平台。