微信小程序更新机制踩坑记录:updateInfo 为什么总是读到旧数据?
摘要:
在 app.js 里用 updateInfo 维护更新日志,但升级时用户看到的始终是旧内容。原因:更新弹窗运行在旧版本代码中,读不到新版本数据(官方机制)。解决方式:更新弹窗只提示重启,更新内容放到新版本页面里展示
一、背景说明
我在做小程序版本升级时,有一个固定习惯:
在 app.js 里维护一个 updateInfo 配置,用来做两件事:
- 记录版本信息
- 在更新时告诉用户"这次改了什么"
大致结构是这样的(已做简化处理):
js
updateInfo = {
version: 'x.x.x',
forceUpdate: true,
updateLogs: {
'x.x.x': [
'功能优化',
'体验改进',
'问题修复'
]
}
}
原本预期是:
用户升级时,可以在弹窗中看到当前版本的更新内容
但实际结果是:用户看到的始终是旧版本的更新日志
例如 我更新了 2.8.0 版本,弹窗永远看到的是 2.7.0 的更新日志
二、原因定位
查了官方文档后,结论很直接:
不是代码问题,是微信小程序更新机制决定的
关键点只有一句话:
更新弹窗运行在旧版本代码中
具体机制:
-
小程序启动:
- 使用本地旧包运行
- 同时后台下载新版本
-
更新提示出现时:
- 仍然在执行旧代码
- 无法访问新版本里的
updateInfo
-
新版本何时生效:
- 必须等下一次冷启动
举个实际例子
- 本地版本:
2.8.x - 发布版本:
2.9.x
流程:
- 用户打开小程序 → 运行旧版本
- 后台下载新版本
- 弹更新提示 → 用的是旧版本代码
- 读取的
updateLogs→ 也是旧版本的
所以用户看到的永远是"旧内容"
四、当前实现逻辑(简述)
项目里做了两层更新相关逻辑:
1. 更新检测(checkForUpdate)
基于 UpdateManager:
- 检测是否有新版本
- 下载完成后触发弹窗
- 调用
applyUpdate重启
2. updateInfo 双分支
| 场景 | 行为 |
|---|---|
| 强制更新 | 只提示重启,不展示日志 |
| 非强制更新 | 展示 updateLogs |
3. 更新亮点弹窗(补充)
额外做了一层"what's new":
- 用本地缓存记录版本
- 控制是否展示更新内容
作用:
把"更新内容展示"从系统更新弹窗里拆出来
五、最终解决方案
1. 更新弹窗只做一件事
js
forceUpdate: true
- 只提示"有新版本,需要重启"
- 不再展示
updateLogs
2. 更新内容换位置展示
把 updateLogs 用在:
更新亮点弹窗(进入页面后展示)
这样有两个好处:
- 使用的是新版本代码 ✅
- 展示内容一定正确 ✅
3. updateInfo 的定位调整
从:
"更新弹窗的数据源"
变为:
"版本记录 + 更新亮点数据源"
六、长期建议
1. 固定策略
- 一律使用强制更新
- 更新弹窗不承载内容展示
2. 版本维护规范
每次发版只做两件事:
- 更新
version - 补充
updateLogs
3. 测试方法
js
// 模拟升级
wx.setStorageSync('last_seen_update_version', '旧版本')
// 模拟首次安装
wx.removeStorageSync('last_seen_update_version')
七、参考资料
-
小程序更新机制
https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/update-mechanism.html -
UpdateManager
https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html
八、结论
-
updateInfo 没问题,问题在机制
-
更新弹窗读取的是旧包代码
-
所以无法展示新版本内容
-
正确做法是:
- 更新弹窗只负责"重启"
- 更新内容用独立弹窗展示