App端必须用plus.runtime.version(仅APP-PLUS平台有效),鸿蒙用uni.getAppBaseInfo().appVersion,H5用构建变量如process.env.UNI_APP_VERSION,小程序用uni.getAccountInfoSync().miniProgram.version;严禁混用uni.getSystemInfoSync().version等错误方式。
直接用 uni.getsysteminfosync().appversion 拿到的不是你想要的“当前 app 版本号”,而是 manifest.json 里编译时写死的字符串——h5 下它甚至和浏览器版本完全无关,ios/android 真机上也未必反映原生包真实版本。必须按平台区分调用方式,否则埋点、更新逻辑全错。
App 端(Android/iOS)必须用 plus.runtime.version
这是唯一能拿到原生安装包真实版本号的方式,uni.getSystemInfoSync().appVersion 在 App 环境下返回的是 manifest.json 的静态值,不随 wgt 热更新变化;而 plus.runtime.version 是运行时从原生层读取的,准确可靠。
- 必须加条件编译:
#ifdef APP-PLUS,否则 H5 或小程序里会报ReferenceError: plus is not defined - 必须做存在性判断:
typeof plus !== 'undefined' && plus.runtime?.version,开发阶段 H5 预览时 plus 不存在 - 注意:热更新(wgt)场景下,
plus.runtime.version返回的是原生壳版本,要取 wgt 包版本得用uni.getSystemInfoSync().appWgtVersion
鸿蒙(HarmonyOS NEXT)只能用 uni.getAppBaseInfo()
plus.runtime 在纯血鸿蒙上完全不可用,强行调用会导致白屏或静默失败。鸿蒙不支持 app-plus 运行时,所有 5+ API 均失效。
-
uni.getAppBaseInfo()是同步函数,直接调用:const { appVersion, appVersionCode } = uni.getAppBaseInfo() -
appVersion是字符串(如"1.2.3"),appVersionCode是数字(如10203),后者更适合做大小比较 - 不要 fallback 到
__UNI_MANIFEST__,鸿蒙环境下该变量为undefined
H5 和小程序不能依赖 manifest 注入字段
H5 下 __UNI_MANIFEST__ 为 undefined,uni.getSystemInfoSync().appVersion 返回的是 manifest.json 编译时填的值,不是运行时动态标识;小程序则必须走 uni.getAccountInfoSync()。
- H5 场景应使用构建变量注入,例如通过
process.env.UNI_APP_VERSION(HBuilderX 3.9.10+ 支持)或 webpackDefinePlugin - 微信小程序唯一可靠方式是
uni.getAccountInfoSync().miniProgram.version,但仅在envVersion === "release"时有效,开发版/体验版返回空字符串 - 千万别用
uni.getSystemInfoSync().version取小程序版本——它返回的是微信客户端版本,不是你的小程序版本
语义化比对必须分段转数字,不能直接字符串比较
版本号如 "1.10.0" 和 "1.9.9" 字符串比较结果是 "1.10.0" ,因为字符 <code>'1' '9',实际数值却相反。
- 推荐拆成数组后逐位转
Number比较:["1","10","0"].map(Number) - 鸿蒙的
appVersionCode是整数,可直接用于大小判断;iOS 的 CFBundleVersion 和 Android 的 versionCode 也都是递增整数,优先取它们 - 避免用
parseFloat("1.10") === 1.1,会丢失精度,"1.10.0"转成浮点就变成1.1
最易被忽略的一点:不同平台的“版本号”根本不是同一个东西——App 端是原生包版本,wgt 是资源包版本,鸿蒙是系统级应用标识,H5 是构建产物哈希或时间戳,小程序是微信托管的发布版本。混用字段做统一更新逻辑,上线后必然出问题。


















