我們都知道,微信小遊戲是有離線緩存的機制,也就是說如果這臺手機之前玩過某個遊戲,再打開遊戲的時候是先加載啓動手機本地緩存住的代碼包,這個代碼包是舊的,之後纔會在後臺向微信服務器下載最新的代碼包。
我們會遇到這樣的需求,微信小遊戲上線後,新開發了一個功能或修復了一個重大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小遊戲、百度小遊戲的更新機制和微信小遊戲是一樣的,故以上代碼完全支持這幾個平臺。