在 uni-app 中需通过全局变量 __UNI_MANIFEST__ 获取 App 版本号,__UNI_MANIFEST__.versionName 为用户可见版本(如"1.2.3"),versionCode 为纯数字递增标识;该变量仅非 H5 平台有效,H5 下为 undefined,须加兜底逻辑。

uni-app 里怎么拿到当前应用的版本号
直接用 uni.getSystemInfoSync().version 拿到的是微信小程序基础库版本,不是你 App 的版本号。真要读自己 App 的版本号,得从 manifest.json 里取——但注意,它只在编译时注入,运行时不可修改,也不能动态更新。
manifest.json 中 versionName 和 versionCode 的区别
Android 打包看 versionCode(纯数字,用于升级判断),iOS 和显示用 versionName(比如 "1.2.3")。uni-app 的 manifest.json 里这两个字段都得填,否则 HBuilderX 打包会警告,部分平台可能拒绝上架。
-
versionName是字符串,可带点号,用户可见,建议和 Git tag 对齐 -
versionCode是整数,每次发版必须严格递增,不能重复 - H5 端不读这两个字段,
uni.getSystemInfoSync().version返回的是 H5 运行环境版本(如 Chrome 版本),别混淆
如何在 JS 里安全读取 manifest.json 的版本字段
不能用 fetch 或 require 直接读取 manifest.json 文件路径,它不在运行时资源中。正确方式是:HBuilderX 编译时会把 manifest.json 的内容注入到全局变量 __UNI_MANIFEST__ 里(仅非 H5 平台有效)。
实操写法:
const manifest = __UNI_MANIFEST__ || {}
const appVersion = manifest.versionName || '0.0.0'
注意点:
- 这个对象只在 App 和小程序端存在,H5 下
__UNI_MANIFEST__是undefined - 不要在
onLaunch外提前访问,某些低版本 uni-app 在组件创建阶段__UNI_MANIFEST__还没就绪 - 如果用了自定义模板(如原生插件或离线打包),需确认 manifest 是否被正确合并进最终包
为什么有时读出来是空或者 undefined
常见原因不是代码写错,而是环境或配置问题:
- 在 HBuilderX 的「运行到浏览器」模式下测试,
__UNI_MANIFEST__一定为空——这正常,H5 不走 manifest 注入逻辑 - manifest.json 根节点少了
name、versionName字段,HBuilderX 可能跳过注入(尤其旧版) - 使用了
uni-app vue3 + vite模式(Alpha 版或 CLI 构建),__UNI_MANIFEST__默认不启用,得手动在vite.config.ts里加 define 注入 - App 端调试时连的是 dev server,但 manifest 读取依赖本地打包产物,真机调试务必用「发行」或「制作自定义基座」再测
复杂点在于:同一个代码,不同构建方式、不同运行平台、不同 HBuilderX 版本,__UNI_MANIFEST__ 的可用性都不一样。别假设它永远存在,加兜底永远比报错强。

















