微信小程序更新机制踩坑记录:updateInfo 为什么总是读到旧数据?

微信小程序更新机制踩坑记录:updateInfo 为什么总是读到旧数据?

摘要:

在 app.js 里用 updateInfo 维护更新日志,但升级时用户看到的始终是旧内容。原因:更新弹窗运行在旧版本代码中,读不到新版本数据(官方机制)。解决方式:更新弹窗只提示重启,更新内容放到新版本页面里展示

一、背景说明

我在做小程序版本升级时,有一个固定习惯:

在 app.js 里维护一个 updateInfo 配置,用来做两件事:

  1. 记录版本信息
  2. 在更新时告诉用户"这次改了什么"

大致结构是这样的(已做简化处理):

js 复制代码
updateInfo = {
  version: 'x.x.x',
  forceUpdate: true,
  updateLogs: {
    'x.x.x': [
      '功能优化',
      '体验改进',
      '问题修复'
    ]
  }
}

原本预期是:

用户升级时,可以在弹窗中看到当前版本的更新内容

但实际结果是:用户看到的始终是旧版本的更新日志

例如 我更新了 2.8.0 版本,弹窗永远看到的是 2.7.0 的更新日志


二、原因定位

查了官方文档后,结论很直接:

不是代码问题,是微信小程序更新机制决定的

关键点只有一句话:

更新弹窗运行在旧版本代码中

具体机制:

  1. 小程序启动:

    • 使用本地旧包运行
    • 同时后台下载新版本
  2. 更新提示出现时:

    • 仍然在执行旧代码
    • 无法访问新版本里的 updateInfo
  3. 新版本何时生效:

    • 必须等下一次冷启动

举个实际例子

  • 本地版本:2.8.x
  • 发布版本:2.9.x

流程:

  1. 用户打开小程序 → 运行旧版本
  2. 后台下载新版本
  3. 弹更新提示 → 用的是旧版本代码
  4. 读取的 updateLogs → 也是旧版本的

所以用户看到的永远是"旧内容"


四、当前实现逻辑(简述)

项目里做了两层更新相关逻辑:

1. 更新检测(checkForUpdate)

基于 UpdateManager:

  • 检测是否有新版本
  • 下载完成后触发弹窗
  • 调用 applyUpdate 重启

2. updateInfo 双分支

场景 行为
强制更新 只提示重启,不展示日志
非强制更新 展示 updateLogs

3. 更新亮点弹窗(补充)

额外做了一层"what's new":

  • 用本地缓存记录版本
  • 控制是否展示更新内容

作用:

把"更新内容展示"从系统更新弹窗里拆出来


五、最终解决方案

1. 更新弹窗只做一件事

js 复制代码
forceUpdate: true
  • 只提示"有新版本,需要重启"
  • 不再展示 updateLogs

2. 更新内容换位置展示

把 updateLogs 用在:

更新亮点弹窗(进入页面后展示)

这样有两个好处:

  • 使用的是新版本代码 ✅
  • 展示内容一定正确 ✅

3. updateInfo 的定位调整

从:

"更新弹窗的数据源"

变为:

"版本记录 + 更新亮点数据源"


六、长期建议

1. 固定策略

  • 一律使用强制更新
  • 更新弹窗不承载内容展示

2. 版本维护规范

每次发版只做两件事:

  1. 更新 version
  2. 补充 updateLogs

3. 测试方法

js 复制代码
// 模拟升级
wx.setStorageSync('last_seen_update_version', '旧版本')

// 模拟首次安装
wx.removeStorageSync('last_seen_update_version')

七、参考资料


八、结论

  1. updateInfo 没问题,问题在机制

  2. 更新弹窗读取的是旧包代码

  3. 所以无法展示新版本内容

  4. 正确做法是:

    • 更新弹窗只负责"重启"
    • 更新内容用独立弹窗展示
相关推荐
李纲明16 小时前
微信小程序次卡跨店对不上账或前台随手改余次:先核流水只增不改与统一日切,再查冲正权限与总部只读
微信小程序·devdiy·核销流水·跨店次卡·日切对账·冲正权限·总部只读
李纲明19 小时前
微信小程序维修拆机后口头加价或未确认就开工:先核验机快照与报价确认,再查补充报价与取机核验
微信小程序·devdiy·维修验机·报价确认·报价快照·补充报价·取机核验
wx1qq1com20 小时前
一桩带几台车:共享租赁桩位配比、取电与结算闭环设计
物联网·微信小程序·小程序
李纲明21 小时前
微信小程序场地长租月底对不上或口头占场撞场:先核合约预约与核销流水出账,再查附加费与转租归属
微信小程序·devdiy·场地长租·月结账单·核销流水·附加费·转租归属
2401_879692511 天前
微信小程序照相与摄像功能实现——chooseImage 与 chooseVideo 详解
微信小程序·小程序·notepad++
律宏阔2 天前
微信小程序 + Taro + TDesign 去掉 [&&&],让普通 Tailwind 类接管局部样式
前端·微信小程序·taro
律宏阔2 天前
微信小程序 + Taro + 多语言实现与国际化检查实录
前端·微信小程序·taro
李纲明3 天前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
dreams_dream3 天前
微信小程序-使用npm包
微信小程序·小程序·npm
L1mbo3 天前
Lite模式 缓解微信开发者工具卡顿,附 uni-app 实践方案
前端·微信小程序