Explorar el Código

feat(cfc-frontend): T40 小程序新版本强制更新(官方 UpdateManager 接入)

- 新增 utils/checkAppUpdate.js:封装 uni.getUpdateManager()
  - 能力探测,不支持时 console.warn 跳过
  - onCheckForUpdate 仅打印日志
  - onUpdateReady 弹「发现新版本」强制弹窗(showCancel=false),确认后 applyUpdate 重启应用新包
  - onUpdateFailed 弹「更新失败」提示删除小程序重进
- App.vue onLaunch 首行调用 checkAppUpdate(),不改动 splash/登录/路由逻辑
- 不依赖 manifest versionName/versionCode,版本判断由微信后台代码包自动完成
E2E Test Bot hace 1 semana
padre
commit
da4a36771a
Se han modificado 2 ficheros con 58 adiciones y 0 borrados
  1. 3 0
      cfc-frontend/App.vue
  2. 55 0
      cfc-frontend/utils/checkAppUpdate.js

+ 3 - 0
cfc-frontend/App.vue

@@ -3,10 +3,13 @@ import config from '@/config.js'
 import Vue from 'vue'
 import { checkUserFamily, verifyToken, bindReferralIfNotSelf, silentRelogin, ssoLogin } from './utils/api.js'
 import { syncFontScale } from './utils/fontScale.js'
+import { checkAppUpdate } from '@/utils/checkAppUpdate.js'
 Vue.prototype.$config = config
 
 export default {
   onLaunch: function(options) {
+    // 尽早检测新版本:applyUpdate 会重启整机,须在任何路由/页面逻辑之前
+    checkAppUpdate()
     console.log('App Launch', options)
     // 同步微信系统字体大小
     syncFontScale()

+ 55 - 0
cfc-frontend/utils/checkAppUpdate.js

@@ -0,0 +1,55 @@
+/**
+ * 小程序新版本强制更新(微信官方 UpdateManager 机制)
+ *
+ * 说明:
+ * - 微信冷启动时会自动检查代码包版本并静默下载新版本,下载完成后才触发 onUpdateReady;
+ * - applyUpdate() 会立即重启小程序并应用新包,这是微信生态下「强制更新」的标准手段;
+ * - 不依赖 manifest.json 的 versionName/versionCode,版本判断由微信后台代码包版本自动完成;
+ * - onUpdateReady 仅在体验版/正式版触发,开发版(envVersion=develop)不会触发,属微信正常行为。
+ *
+ * 文档:docs/superpowers/specs/2026-11-03-miniapp-force-update.md
+ */
+export function checkAppUpdate() {
+  // 能力探测:部分基础库/平台不支持
+  if (typeof uni.getUpdateManager !== 'function') {
+    console.warn('[update] 当前环境不支持 getUpdateManager,跳过更新检测')
+    return
+  }
+
+  var manager
+  try {
+    manager = uni.getUpdateManager()
+  } catch (e) {
+    console.warn('[update] 获取 UpdateManager 失败,跳过更新检测', e)
+    return
+  }
+  if (!manager) return
+
+  manager.onCheckForUpdate(function (res) {
+    // res.hasUpdate:仅用于日志,无新版本时不需要任何交互
+    console.log('[update] 检查更新:', res && res.hasUpdate ? '有新版本' : '已是最新')
+  })
+
+  manager.onUpdateReady(function () {
+    // 新版本下载完毕 → 强制弹窗(无取消按钮)→ 用户点确定即重启应用新包
+    uni.showModal({
+      title: '发现新版本',
+      content: '小程序已发布新版本,点击「立即更新」后即可使用最新功能。',
+      showCancel: false,
+      confirmText: '立即更新',
+      success: function () {
+        manager.applyUpdate()
+      }
+    })
+  })
+
+  manager.onUpdateFailed(function () {
+    // 下载失败(弱网/存储不足/被微信拒):仅提示,不阻塞主流程
+    uni.showModal({
+      title: '更新失败',
+      content: '新版本下载失败,请检查网络后删除小程序重新进入。',
+      showCancel: false,
+      confirmText: '我知道了'
+    })
+  })
+}