| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /**
- * 微信小程序正式版更新:先开本地缓存包、再异步下载新包。
- * 新包就绪后强制重启,避免用户长期停留在旧界面。
- * 仅正式版有版本概念;开发版/体验版无更新流程。
- *
- * @see docs/superpowers/specs/2026-09-26-mp-weixin-force-update-design.md
- */
- const SHOW_DEBOUNCE_MS = 30 * 1000
- let listenersBound = false
- let readyModalShown = false
- let failedModalShown = false
- let lastCheckAt = 0
- function bindUpdateListeners(updateManager) {
- if (listenersBound) return
- listenersBound = true
- updateManager.onCheckForUpdate((res) => {
- console.log('[mpUpdate] onCheckForUpdate hasUpdate=', !!(res && res.hasUpdate))
- })
- updateManager.onUpdateReady(() => {
- if (readyModalShown) return
- readyModalShown = true
- uni.showModal({
- title: '更新提示',
- content: '新版本已准备好,需要重启以使用最新功能',
- showCancel: false,
- confirmText: '立即重启',
- success: (res) => {
- if (res.confirm) {
- updateManager.applyUpdate()
- }
- }
- })
- })
- updateManager.onUpdateFailed(() => {
- if (failedModalShown) return
- failedModalShown = true
- uni.showModal({
- title: '更新失败',
- content: '新版本下载失败,请删除小程序后重新搜索打开,或检查网络后重试',
- showCancel: false
- })
- })
- }
- export function checkMpUpdate() {
- // #ifdef MP-WEIXIN
- const now = Date.now()
- if (lastCheckAt && now - lastCheckAt < SHOW_DEBOUNCE_MS) {
- return
- }
- lastCheckAt = now
- if (typeof uni.canIUse !== 'function' || !uni.canIUse('getUpdateManager')) {
- return
- }
- const updateManager = uni.getUpdateManager()
- bindUpdateListeners(updateManager)
- // #endif
- }
|