本文介绍的方法同样适用于QQ小游戏、字节小游戏、以及vivo、oppo小游戏等等。
我们都知道,微信小游戏是有离线缓存的机制,也就是说如果这台手机之前玩过某个游戏,再打开游戏的时候是先加载启动手机本地缓存住的代码包,这个代码包是旧的,之后才会在后台向微信服务器下载最新的代码包。
我们会遇到这样的需求,微信小游戏上线后,新开发了一个功能或修复了一个重大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小游戏、百度小游戏的更新机制和微信小游戏是一样的,故以上代码完全支持这几个平台。