|
@@ -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: '我知道了'
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+}
|