在 uni-app 中,uni.getSystemInfoSync() 和 plus.runtime.getProperty(plus.runtime.appid) 都能获取版本信息,但它们的核心区别在于返回的版本类型不同,这对于实现版本升级至关重要。
简单来说:
plus.runtime.getProperty(...): 获取的是 WGT 资源包版本。这是热更新后的实际运行版本。uni.getSystemInfoSync(): 获取的是 App 安装包(基座)版本。这是你从应用商店下载或打包生成的 APK/IPA 文件的版本。
🔍 详细区别与对比
为了更清晰地理解,我们可以通过一个表格来对比:
| 特性 | plus.runtime.getProperty(plus.runtime.appid) |
uni.getSystemInfoSync() |
|---|---|---|
| 获取方式 | 异步方法调用 | 同步方法调用 |
| 版本类型 | WGT 资源包版本 (当前运行的 js 代码版本) | App 安装包/基座版本 (原生壳版本) |
| 主要用途 | 热更新(资源在线升级)的版本比对 | 判断是否需要整包更新、区分平台等 |
| 更新后变化 | 热更新后会立即变为新版本号 | 只有重新安装 App 才会改变 |
| 执行时机 | 需要在回调函数中获取数据 | 立即返回结果 |
💡 如何选择用于版本升级?
选择哪个方法取决于你的更新策略。在实际项目中,通常会将两者结合使用,以支持两种更新模式:热更新(增量更新)和整包更新(强制更新)。
场景一:热更新 (WGT Update)
如果你的更新不涉及原生插件的增删改,只是修改了前端页面、样式或 JS 逻辑,那么应该使用热更新。
- 应使用:
plus.runtime.getProperty(plus.runtime.appid, ...) - 原因: 你需要获取用户手机上当前正在运行的 WGT 包的版本号,然后与你服务器上的最新版本号进行比对。如果服务器版本更高,则下载并安装新的 WGT 包。
- 关键点: 安装成功后,必须调用
plus.runtime.restart()重启 App,新版本才能生效。
场景二:整包更新 (Store Update)
如果你的更新涉及原生功能(如新增地图模块、修改原生插件),或者你希望引导用户去应用商店下载最新版,则需要整包更新。
- 应使用:
uni.getSystemInfoSync().appVersion或plus.runtime.version - 原因: 这两种方式获取的都是 App 安装包的版本。你可以用这个版本号去和你的服务器比对,如果发现有大版本更新,就弹窗提示用户前往应用商店(Android)或 App Store(iOS)进行更新。
📝 实践建议与代码示例
一个健壮的版本更新检测逻辑通常会融合这两种方式。服务端会根据客户端上报的版本信息,判断是返回 WGT 更新包还是引导去应用商店。
以下是一个简化的实现思路:
// 在 App.vue 的 onLaunch 生命周期中进行检测onLaunch() {// #ifdef APP-PLUS// 1. 首先获取 WGT 包版本,用于热更新检测plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {const currentWgtVersion = widgetInfo.version; // 例如 "1.0.5"// 2. 同时获取 App 安装包版本,备用const appInstallVersion = plus.runtime.version; // 例如 "1.1.0"// 3. 请求服务器,带上两个版本号uni.request({url: 'https://your-server.com/api/check-update',data: {wgtVersion: currentWgtVersion,appVersion: appInstallVersion,platform: uni.getSystemInfoSync().platform // 'android' or 'ios'},success: (res) => {const updateInfo = res.data;if (updateInfo.type === 'wgt') {// --- 处理热更新 ---console.log('发现资源更新,开始下载...');this.doWgtUpdate(updateInfo.wgtUrl);} else if (updateInfo.type === 'store') {// --- 处理整包更新 ---console.log('发现重要更新,请前往应用商店更新');this.showStoreUpdateModal(updateInfo.storeUrl);}}});});// #endif},methods: {// 执行 WGT 更新doWgtUpdate(wgtUrl) {uni.downloadFile({url: wgtUrl,success: (downloadResult) => {if (downloadResult.statusCode === 200) {plus.runtime.install(downloadResult.tempFilePath, {}, () => {console.log('WGT 安装成功');// 【关键步骤】重启应用使更新生效plus.runtime.restart();}, (e) => {console.error('WGT 安装失败', e);});}}});},// 显示去应用商店更新的弹窗showStoreUpdateModal(storeUrl) {uni.showModal({title: '版本更新',content: '发现新版本,请前往应用商店更新以获得最佳体验。',confirmText: '去更新',success: (res) => {if (res.confirm) {plus.runtime.openURL(storeUrl);}}});}}
⚠️ 特别注意事项
鸿蒙平台 (HarmonyOS)
- 对于鸿蒙应用,推荐使用跨平台 API
uni.getAppBaseInfo()或uni.getSystemInfo()来获取版本信息,而不是plus相关的方法,因为鸿蒙可能不完全支持app-plus模块。 uni.getAppBaseInfo()会返回appVersion(版本名称) 和appVersionCode(版本号),这两个值对应manifest.json中的配置。
- 对于鸿蒙应用,推荐使用跨平台 API
测试环境
- 在 HBuilderX 真机运行模式下,获取到的版本信息是 HBuilder 基座应用的,而非你自己的应用。因此,版本更新功能必须在打包成自定义基座或正式包后进行测试。
不要混淆
- 切勿使用
plus.runtime.version来判断是否需要热更新,因为它获取的是安装包版本,不会随 WGT 更新而改变。
- 切勿使用
