必须用plus.runtime.getProperty读取manifest.json固化值获取真正可靠的本地App版本号,它返回打包时填的versionName(如"2.8.5"),重启不变、不受wgt热更新干扰;需传plus.runtime.appid、包裹在plus.ready中、加#ifdef APP条件编译。

直接用 uni.getSystemInfoSync().version 比对,90% 的更新逻辑会失效——它在 iOS 和 Android 上行为不一致,热更新后还可能变,根本不是你打包的原生包版本。
怎么拿到真正可靠的本地 App 版本号
必须用 plus.runtime.getProperty 读取 manifest.json 固化值,且只在 App 环境生效。它返回的是打包时填的 versionName(如 "2.8.5"),重启不变、不受 wgt 热更新干扰。
- 一定要传
plus.runtime.appid,漏传会返回空或默认值 - 必须包裹在
plus.ready(() => {})中,否则 H5+ 插件未就绪会报错 - 加
#ifdef APP条件编译,避免小程序/H5 环境执行报错 - 开发环境建议跳过:用
process.env.NODE_ENV === 'development'拦住,防止反复弹窗
服务端返回的版本怎么比才不会翻车
字符串字典序比较 "1.10.0" 返回 true 是最常见错误。语义化版本不是数字,必须分段转 Number 后逐位比对。
- 前端要先清洗服务端版本:去掉前缀(
v1.2.3→1.2.3)、后缀(1.2.3-beta→1.2.3),正则推荐remoteVer.replace(/^v|[^0-9.]/g, '') - 别用
parseInt或parseFloat直接转,"1.10"会被截成1 -
uni-app 官方提供
uni.compareVersion(a, b):返回-1(a 0(相等)、1(a > b),够用且稳定 - 服务端字段必须和客户端格式严格一致,禁止混用
"1.2.3"、1.2.3(数字)、"v1.2.3"
检测时机为什么不能只写在 onLaunch
冷启动走 onLaunch,但用户从后台切前台时它根本不执行——这时候用户可能还在用旧版,你完全没机会提示。
- 必须同时监听
onLaunch(冷启动)和onShow(前后台切换) -
onShow要加节流,比如 5 分钟内只查一次,避免频繁请求 - 别在回调里直接弹窗或下载,网络延迟会导致白屏卡顿;应先缓存服务端响应,再触发 UI 或安装流程
- 强制更新需路由守卫拦截:拿到结果后设全局状态,
beforeEach中判断并uni.redirectTo到纯弹窗页,禁用返回
最容易被忽略的是平台差异:iOS 无法自动安装 IPA,uni.installApk 在 iOS 下无效果;Android 11+ 必须声明 android:requestLegacyExternalStorage="true",否则下载直接失败。版本检测只是第一步,后续下载路径、权限、校验、安装兜底,每一步都有硬坑。











