微信小程序无真正静默更新,新版本需用户手动重启;uni.getupdatemanager()是唯一可靠入口,onupdateready触发后必须弹窗并立即调用applyupdate。

微信小程序没有真正意义上的“静默更新”——它不支持后台自动重启,也不允许绕过用户确认直接生效。所谓“静默”,仅指新版本在后台静默下载完成,但最终必须由用户手动触发重启。关键不是隐藏弹窗,而是把提示做得轻量、时机卡得准、重启动作不可跳过。
uni.getUpdateManager() 是唯一可靠入口
不能用 uni.downloadFile 或服务端版本比对替代它。微信的更新机制是封闭的:新包由微信客户端自己拉取、校验、缓存,uni.getUpdateManager() 返回的对象才是和这个机制通信的唯一通道。
- 真机调试前务必先调
uni.getProvider({service: 'update'})确认支持,iOS 模拟器和 H5 环境返回null -
onCheckForUpdate只告诉你“有没有新包”,不保证能下下来;真正可靠的是onUpdateReady,它触发时说明新包已就绪、可安全重启 - 不要在
onLaunch里立刻监听onUpdateReady,冷启动时事件可能丢失;推荐在onShow或延后 300ms 的setTimeout中注册
onUpdateReady 触发后必须 showModal + applyUpdate
这个回调一来,你就只剩一件事要做:弹窗 + 调用 updateManager.applyUpdate()。不弹窗?用户无感知;不调 applyUpdate()?新包永远不生效。
- 弹窗文案别写“是否更新”,要写“新版本已准备好,点击确定立即生效”,按钮文字用“立即重启”比“确定”更明确
- 弹窗
success回调里必须同步执行updateManager.applyUpdate(),不能加setTimeout或 Promise 延迟 - 如果用户点取消,不要重试或轮询——微信不允许重复触发
applyUpdate(),再次调用会静默失败
常见失效原因:缓存、时机、平台差异
很多“没反应”的问题,不是代码错,而是环境没对上。
- 开发版/体验版更新秒生效,正式版有 24–48 小时延迟,别拿开发版测试正式流程
- CDN 或 Nginx 缓存了旧的小程序包?检查响应头是否有
Cache-Control: no-cache,尤其注意swan.js和主包路径 - 安卓低端机或 MIUI/EMUI 系统可能杀掉后台,导致
onUpdateReady未触发——建议在onShow里补一次updateManager.checkForUpdate() - 别用
plus.runtime.version(5+ API)去比对微信小程序版本,它在微信环境根本不存在
最易被忽略的一点:微信不会告诉你新版本号是多少。onUpdateReady 不带任何版本信息,你无法做“v1.2.3 → v1.2.4”的精准提示。如果需要显示具体版本,只能靠服务端接口配合,但要注意——那只是辅助文案,不能作为是否更新的判断依据。











