uni-app 中获取构建号最稳方案是使用 plus?.runtime?.version || '1.0.0'(需 HBuilderX 勾选自动生成 versionCode/CFBundleVersion),manifest.json 无法运行时直接读取,推荐通过 define 在编译时注入配置变量。

uni-app 怎么获取当前 App 的版本构建号(Android/iOS)
在 uni-app 中,uni.getSystemInfoSync() 返回的 version 是 manifest.json 里配置的「版本名称」(如 "1.2.3"),不是构建号(build number)。真正对应 Android 的 versionCode 或 iOS 的 CFBundleVersion,需要走原生层读取。
跨平台统一获取构建号的可靠方式是:通过 uni.getProvider + 原生插件或条件编译调用原生 API。但更轻量、无需插件的做法是——在构建时把构建号注入到 JS 环境中。
- Android:在
android/app/build.gradle里用buildConfigField注入,再通过uni.requireNativePlugin拿(需自定义原生模块) - iOS:在
Info.plist里确保CFBundleVersion已设值,然后用plus.runtime.version(仅 5+ 环境可用) - 推荐做法:在
manifest.json的name字段后追加构建标识,或使用process.env.UNI_APPX_VERSION(HBuilderX 3.9.10+ 支持)
实际项目中,最稳的方案是:HBuilderX 打包时勾选「自动生成 versionCode / CFBundleVersion」,然后在 JS 中用:
const buildNumber = plus?.runtime?.version || '1.0.0'
注意:plus.runtime.version 在微信小程序、H5 环境为 undefined,必须做存在性判断。
uni-app 如何读取 manifest.json 的完整配置项
manifest.json 是编译期静态配置,运行时无法直接读取原始 JSON 文件(尤其在小程序平台受沙箱限制)。但部分字段会被 uni-app 框架提取并挂载到全局对象上。
关键结论:不能用 require('./manifest.json'),也不能用 fetch 请求本地文件路径(H5 可能报 CORS,App 和小程序根本不可访问)。
-
uni.getSystemInfoSync().platform可间接反映目标平台("app-android"/"app-ios"/"mp-weixin") -
uni.getProvider({service: 'oauth'})能识别是否启用微信登录等服务,对应 manifest 中的mp-weixin下appid配置 - HBuilderX 3.8.10+ 提供了
__UNI_CONFIG__全局变量(仅开发环境),含部分 manifest 解析结果,但不包含敏感字段如key、certificate - 若需读取自定义字段(如
"custom": {"buildId": "20240601"}),必须手动写入static/config.js并import,或通过 webpack.DefinePlugin 注入
为什么 uni.getSystemInfoSync().version 和 manifest 里的 version 不一致
常见现象:改了 manifest.json 的 versionName,但 uni.getSystemInfoSync().version 没变;或者真机调试时显示的是 HBuilderX 的 IDE 版本号。
根本原因:这个字段在不同平台来源不同 ——
- App 平台(Android/iOS):
uni.getSystemInfoSync().version来自原生PackageInfo.versionName(即 manifest.json 的versionName),但仅当使用「自定义基座」或正式打包时才生效;真机调试用的是 HBuilderX 自带的调试基座,其 version 固定 - 微信小程序:
version对应project.config.json的miniprogramRoot下app.json的version,和 uni-app 的 manifest 无关 - H5:
version恒为"1.0.0",不可靠
所以,不要依赖 uni.getSystemInfoSync().version 做业务逻辑分支,它只是参考值。真正要用于灰度、AB 测试的版本标识,建议从服务端下发,或用独立变量维护。
安全读取 manifest 配置的替代方案(无原生依赖)
如果只是想让 JS 层知道某些 manifest 设置(比如是否开启统计、默认语言、API 地址前缀),最干净的方式是:把它们抽成构建时变量,而不是运行时去“读”。
HBuilderX 支持在 vue.config.js 或 manifest.json 同级的 uniCloud/cloudfunctions/common/config.js 中定义,但更通用的是利用 define:
// vue.config.js
module.exports = {
define: {
__APP_VERSION__: JSON.stringify(process.env.UNI_APPX_VERSION || 'dev'),
__API_BASE__: JSON.stringify(process.env.NODE_ENV === 'production' ? 'https://api.example.com' : 'https://test.api.example.com')
}
}
然后在代码中直接使用 __APP_VERSION__ —— 它会在编译时被替换,零运行时开销,且各平台一致。
注意:不要把证书、密钥等敏感信息放这里,define 变量会暴露在前端代码中。


















