uni.getSystemInfoSync().appVersion在H5下是manifest.json编译时注入的静态字符串,并非浏览器版本;正确做法是H5用构建变量或服务端下发版本标识,而非依赖该字段。

uni.getSystemInfoSync().appVersion 在 H5 下返回的是 manifest.json 填的值,不是浏览器版本
很多人调用 uni.getSystemInfoSync().appVersion 后发现 H5 页面里显示的“1.2.3”和自己在 manifest.json 里填的一样,就以为拿对了——其实它根本不是运行时动态值,只是编译时注入的静态字符串。这个字段在 H5 环境下不反映任何真实运行环境信息,比如 Chrome 版本或微信内置浏览器版本。
容易踩的坑:
- 误把
appVersion当作用户当前浏览器版本,结果埋点、兼容逻辑全错位 - 在 H5 条件编译里没做兜底,直接渲染“当前版本:${appVersion}”,上线后发现所有 H5 用户都看到同一个固定值
- 想靠它做 H5 动态更新提示?不行,它不会随资源包变更自动刷新
正确做法是:H5 场景下如需区分发布批次,应改用构建时注入的环境变量(如通过 process.env.UNI_APP_VERSION),或服务端下发版本标识。
plus.runtime.version 只在原生 App 打包后生效,H5 和小程序里会报 plus is not defined
plus.runtime.version 是 5+ SDK 的原生能力,仅在 app-plus 编译目标且真机/模拟器运行时可用。开发阶段用 H5 预览或微信开发者工具调试时,plus 对象根本不存在,直接访问会触发 ReferenceError。
安全使用方式:
- 必须加运行时判断:
typeof plus !== 'undefined' && plus.runtime - 推荐封装成函数并 fallback 到
__UNI_MANIFEST__?.versionName(非 H5 平台)或uni.getSystemInfoSync().appVersion(H5) - Android/iOS 包内热更新(wgt)场景下,
plus.runtime.version返回的是原生壳版本,不是 wgt 包版本;要取 wgt 版本得用uni.getSystemInfoSync().appWgtVersion
鸿蒙平台不能用 plus.runtime,必须用 uni.getAppBaseInfo() 或 uni.getSystemInfo()
纯血鸿蒙(HarmonyOS NEXT)不支持 app-plus 运行时,plus 相关 API 全部不可用。强行调用不仅无效,还可能引发白屏或静默失败。
鸿蒙专用方案:
-
uni.getAppBaseInfo()是同步接口,直接返回对象,appVersion和appVersionCode字段可用 -
uni.getSystemInfo()异步回调中也能拿到相同字段,适合需要等待设备就绪后再读取的场景 - 务必确认 HBuilderX ≥ 4.61,低版本对鸿蒙
appVersionCode支持不完整 - 别依赖
model或system字段反推鸿蒙——osName === 'harmony'才是唯一可靠标识,但得先uni.canIUse('getDeviceInfoSync')守住底线
微信小程序只能用 uni.getAccountInfoSync().miniProgram.version,且仅正式版有效
小程序的“当前运行版本号”不是系统信息,而是微信平台侧管理的发布状态标识。uni.getSystemInfoSync().version 拿到的是微信客户端版本(如“8.0.48”),appVersion 是基础库版本(如“3.4.8”),都不是你发的小程序 1.2.0。
关键限制:
-
uni.getAccountInfoSync().miniProgram.version在开发版、体验版下恒为""或undefined,这是微信强制策略,不是 bug - 真正能用的只有
envVersion字段:"develop"/"trial"/"release",它永远可取,且是做环境隔离的唯一依据 - 版本比对逻辑必须包裹在
envVersion === 'release'条件内,否则上线前测试会误判
跨平台统一读取版本号最麻烦的地方不在 API 差异,而在每个平台对“版本”本身的定义完全不同:App 看 manifest,鸿蒙看 API 返回,小程序看发布环境,H5 其实根本没有运行时版本概念——这点最容易被忽略。


















