这四个包都用于在 React Native 项目中获取应用版本、构建号或设备详细信息,但适用场景不同。expo-application 是 Expo 托管工作流的首选;react-native-device-info 提供最全的设备硬件信息;react-native-version-check 专注于应用商店版本比对以强制更新;react-native-version-number 较老旧,主要用于解析本地配置文件中的版本号。
在移动应用开发中,获取应用版本号、构建号以及设备详细信息是基础需求。这四个库都能解决部分问题,但它们的底层实现、适用场景和维护状态差异巨大。本文将从架构师视角,对比它们在真实工程中的表现。
获取版本号是最常见的场景。虽然结果相同,但调用方式反映了库的设计哲学。
expo-application 采用静态属性访问,无需异步调用。
// expo-application
import * as Application from 'expo-application';
const version = Application.nativeApplicationVersion;
const build = Application.nativeBuildVersion;
react-native-device-info 提供同步和异步两种方法。
// react-native-device-info
import DeviceInfo from 'react-native-device-info';
const version = DeviceInfo.getVersion();
const build = DeviceInfo.getBuildNumber();
react-native-version-number 直接导出对象属性。
// react-native-version-number
import VersionNumber from 'react-native-version-number';
const version = VersionNumber.appVersion;
const build = VersionNumber.buildVersion;
react-native-version-check 主要关注商店版本,但也提供本地版本获取。
// react-native-version-check
import VersionCheck from 'react-native-version-check';
const version = VersionCheck.getVersion();
const build = VersionCheck.getBuildNumber();
这是区分库功能边界的关键点。只有专门设计的库才能可靠地处理商店 API。
expo-application 不支持商店版本比对。
// expo-application
// 不支持此功能,需自行 fetch 商店接口
// const storeVersion = await fetchStoreVersion();
react-native-device-info 不支持商店版本比对。
// react-native-device-info
// 不支持此功能,需配合其他库使用
// const storeVersion = await customCheck();
react-native-version-check 核心功能就是商店比对。
// react-native-version-check
import VersionCheck from 'react-native-version-check';
const result = await VersionCheck.checkVersion({
force: true,
skipStoreVersionCheck: false
});
// result.isNeeded 表示是否需要更新
react-native-version-number 不支持商店版本比对。
// react-native-version-number
// 不支持此功能,仅本地解析
// const local = VersionNumber.appVersion;
当需要获取电池、内存或设备 ID 时,选择范围迅速缩小。
expo-application 仅提供应用级信息。
// expo-application
// 无设备硬件 API
// 只能获取 Application.applicationId
react-native-device-info 提供最全的硬件信息。
// react-native-device-info
import DeviceInfo from 'react-native-device-info';
const battery = await DeviceInfo.getBatteryLevel();
const freeMemory = await DeviceInfo.getFreeMemory();
const deviceId = DeviceInfo.getDeviceId();
react-native-version-check 不提供设备硬件信息。
// react-native-version-check
// 无设备硬件 API
react-native-version-number 不提供设备硬件信息。
// react-native-version-number
// 无设备硬件 API
在 Expo 生态中,原生模块的支持程度直接决定开发体验。
expo-application 完美支持 Expo 托管工作流。
// app.json 无需额外配置
// 直接安装即可使用
// expo install expo-application
react-native-device-info 需要 Expo 开发客户端。
// 需要预构建 (Prebuild)
// npx expo prebuild
// 否则部分 API 会返回默认值
react-native-version-check 需要原生链接。
// 需要原生配置
// iOS: 需配置 StoreKit
// Android: 需配置 Play Billing (部分功能)
react-native-version-number 需要原生链接。
// 需要原生链接
// 可能存在与新版本 RN 的兼容问题
选择库不仅看功能,还要看长期维护成本。
expo-application 由 Expo 团队维护。
react-native-device-info 社区维护,非常活跃。
react-native-version-check 维护频率中等。
react-native-version-number 维护频率较低。
| 特性 | expo-application | react-native-device-info | react-native-version-check | react-native-version-number |
|---|---|---|---|---|
| 本地版本获取 | ✅ 同步属性 | ✅ 同步方法 | ✅ 辅助功能 | ✅ 同步属性 |
| 商店版本比对 | ❌ 不支持 | ❌ 不支持 | ✅ 核心功能 | ❌ 不支持 |
| 设备硬件信息 | ❌ 不支持 | ✅ 全面支持 | ❌ 不支持 | ❌ 不支持 |
| Expo 托管支持 | ✅ 完美支持 | ⚠️ 需 Dev Client | ⚠️ 需原生配置 | ⚠️ 需原生配置 |
| 维护状态 | 🟢 官方维护 | 🟢 社区活跃 | 🟡 中等 | 🟡 较低 |
expo-application 是 Expo 托管项目的标准答案 📦。如果你的团队依赖 Expo 的快速迭代能力,不要引入额外的原生依赖来获取版本号。
react-native-device-info 是通用 React Native 项目的首选 🔧。当你需要设备指纹、电池状态或更深层的系统信息时,它是唯一可靠的选择。
react-native-version-check 是强制更新场景的专用工具 🔄。不要试图用其他库模拟商店比对逻辑,维护成本会远高于引入这个库。
react-native-version-number 建议逐步淘汰 🗑️。除非你在维护一个无法迁移的旧项目,否则新项目应优先选择 react-native-device-info 以获得更好的长期支持。
最终建议:大多数项目应该组合使用 expo-application(如果是 Expo)或 react-native-device-info(获取本地版本)加上 react-native-version-check(获取商店版本)。避免为了单一功能引入过多冗余依赖。
如果你使用 Expo 托管工作流(Managed Workflow),这是唯一无需原生代码修改即可获取版本信息的方案。它集成在 Expo SDK 中,维护稳定,适合大多数标准 Expo 项目。
如果你需要获取详细的设备硬件信息(如电池电量、空闲内存、设备 ID)或在 Expo 开发客户端中使用,选它。它是社区最活跃的方案,API 覆盖最广。
如果你需要实现“强制更新”功能,即比对当前版本与应用商店最新版本,选它。它专门处理 Store Kit 和 Google Play API 的细节,其他包不具备此功能。
仅建议在旧项目维护或特定解析需求中使用。新项目不建议采用,因为 react-native-device-info 已覆盖其功能且维护更积极,此包存在兼容性风险。