最可靠方式是plus.runtime.version,需在plus.ready回调内调用并加try/catch防护;它读取manifest.json固化版本,格式统一为"2.8.5",不随wgt热更新变动,且兼容android/ios。

怎么安全获取当前 App 版本号(plus.runtime.version vs getAppBaseInfo)
直接用 uni.getAppBaseInfo().appVersion 在 iOS 上可能返回空或错误值,尤其在冷启动、未完成 plus 初始化时。真正可靠的本地版本来源只有一个:plus.runtime.version —— 它读取的是 manifest.json 里填的 versionName,打包即固化,不随 wgt 热更新变动。
但必须加防护:该 API 在 H5 端不存在,且在 plus.ready 前调用会返回 undefined 或抛错。实操建议:
- 只在
plus.ready(() => { ... })回调内读取plus.runtime.version - Android/iOS 都可用,返回格式统一为
"2.8.5"这类纯数字点分格式 - 别混用
appWgtVersion或getAppBaseInfo().appVersion做原生包比对,它们语义不同、时机不可控 - 加
try/catch包裹,避免插件未就绪导致整个检查流程中断
为什么 compareVersions 函数不能用字符串比较(1.10
"1.10" 返回 <code>true 是典型翻车现场——字典序把 "10" 当成字符 "1""0",而非数值 10。版本号是分段优先级序列,不是浮点数。
服务端返回的 version 字段若带前缀(如 "v1.2.3")、后缀(如 "1.2.3-beta")或空格,前端必须清洗后再比对:
- 用正则
remoteVer.replace(/^v|[^0-9.]/g, '')提纯 - 分段转
Number:"1.2.0".split('.').map(Number) → [1, 2, 0] - 逐位比对,位数不等时补 0,长版本更高(
"1.2.0" > "1.2") - 函数返回值建议统一为 -1 / 0 / 1,方便后续判断逻辑(如
compareVersions(serverVer, localVer) > 0表示需更新)
iOS 怎么检测 App Store 最新版本并跳转(不能装包,只能跳)
iOS 禁止应用内下载安装,所谓“检测更新”本质是:拿到 App Store 当前上架版本号,与本地比对;若需更新,仅能跳转到对应 App Store 页面。关键点不在前端逻辑多复杂,而在如何可靠获取商店版本。
苹果官方不提供公开 API,主流做法是请求 iTunes Lookup 接口(虽非官方支持,但长期稳定):
- URL 格式:
https://itunes.apple.com/lookup?id=YOUR_APPLE_ID,其中YOUR_APPLE_ID是你在 App Store Connect 里看到的 9 位或 10 位数字 ID(不是 Bundle ID) - 响应中
results[0].version是当前商店版本号,注意它可能含空格或短横,需清洗 - 跳转地址用:
itms-apps://apps.apple.com/app/id{YOUR_APPLE_ID}(iOS 14+ 支持 https 形式,但兼容性不如 itms-apps) - 必须做失败兜底:网络超时、ID 错误、无结果时,至少要给用户一个手动去 App Store 搜索的提示
安卓静默安装失败的三个隐形卡点(INSTALL_FAILED_USER_RESTRICTED)
调用 plus.runtime.install() 后没反应、控制台无报错、fail 回调里 e.message 为空——大概率是 Android 8+ 的权限墙或路径问题。
最常踩的坑:
-
REQUEST_INSTALL_PACKAGES权限没申请:Android 8(API 26)起强制要求,必须在manifest.json → 模块配置 → Native.js 权限中勾选,并在安装前调用plus.android.requestPermissions - 下载路径非法:不能用
uni.downloadFile默认的公共 Download 目录,推荐写入_doc/update.apk(应用私有目录) - 签名不一致:wgt 包或 APK 必须和原始安装包使用同一份证书签名;云打包和自定义基座签名不同,切勿混用
这些点不显眼,但任何一个没到位,install() 就会静默失败,连错误码都不抛。测试时务必在真机上验证完整链路,而不是只看“下载成功”。











