React Native 的设备信息。
您的 iOS Podfile 需要升级到最低 iOS 10。该模块 v7 不再支持 iOS9。
使用 npm:
npm install --save react-native-device-info
或使用纱线:
yarn add react-native-device-info
如果您想使用 Install Referrer 跟踪,您需要将此配置添加到您的 Proguard 配置中
-keep class com.android.installreferrer.api.** {
*;
}
如果您在发布的 apk 上遇到 hasGms() 问题,请将以下规则添加到您的 Proguard 配置中
-keep class com.google.android.gms.common.** {*;}
该模块默认为 AndroidX,您应该在android/build.gradle
文件的“ext”块中配置与此类似的库版本
.. .
ext {
// dependency versions
We have 3 options for deviceId :
// Option 1 (latest):
firebaseIidVersion = " 19.0.1 " // default: "19.0.1"
// Option 2 (legacy GooglePlay dependency but using AndroidX):
googlePlayServicesIidVersion = " 17.0.0 " // default: "17.0.0" - AndroidX
// Option 3 (legacy GooglePlay dependency before AndroidX):
googlePlayServicesIidVersion = " 16.0.1 "
// include as needed:
compileSdkVersion = " 28 " // default: 28 (28 is required for AndroidX)
targetSdkVersion = " 28 " // default: 28 (28 is required for AndroidX)
supportLibVersion = ' 1.0.2 ' // Use '28.0.0' or don't specify for old libraries, '1.0.2' or similar for AndroidX
mediaCompatVersion = ' 1.0.1 ' // Do not specify if using old libraries, specify '1.0.1' or similar for androidx.media:media dependency
supportV4Version = ' 1.0.0 ' // Do not specify if using old libraries, specify '1.0.0' or similar for androidx.legacy:legacy-support-v4 dependency
}
.. .
如果您需要非 AndroidX,则需要以反向模式使用 jetifier 软件包,该软件包提供了文档。
对于新的 React-Native 开发人员来说,原生模块中的链接是一个常见的麻烦来源,导致诸如“RNDeviceInfo is null”等错误。因此,实现了自动链接,并且应该在您的项目中使用它。
所有平台都支持自动链接(甚至是 React Native >= 0.63 上的 Windows!)
以前的版本需要手动链接。不为这些以前的react-native版本提供支持,但如果您愿意,可以参考本自述文件的旧版本。升级到现代版本的react-native。如果需要,请使用互联网上的upgrade-helper
工具。
import DeviceInfo from 'react-native-device-info' ;
// or ES6+ destructured imports
import { getUniqueId , getManufacturer } from 'react-native-device-info' ;
请注意,许多 API 都是特定于平台的。如果平台没有实现,那么您将收到的“默认”返回值对于字符串是"unknown"
,对于数字是-1
,对于布尔值是false
。数组和对象将为空(分别为[]
和{}
)。
大多数API都会返回一个Promise,但也有相应的API,末尾带有Sync
,同步运行。例如,您可能更愿意在应用程序引导期间调用isCameraPresentSync()
以避免在应用程序启动的第一部分期间进行异步调用。
关于 getUserAgentSync 的注意事项
虽然异步方法getUserAgent
在两个平台上均可用, getUserAgentSync
仅在 Android 上受支持。
此存储库中的示例应用程序显示了每个 API 的示例用法,如果您有疑问,请查阅示例应用程序,如果您认为发现问题,请确保在报告问题之前可以使用示例应用程序重现它,谢谢。
方法 | 返回类型 | iOS系统 | 安卓 | 视窗 | 网络 | 视觉操作系统 |
---|---|---|---|---|---|---|
获取AndroidId() | Promise | ✅ | ||||
getApiLevel() | Promise | ✅ | ||||
获取应用程序名称() | string | ✅ | ✅ | ✅ | ✅ | |
获取可用位置提供者() | Promise | ✅ | ✅ | ✅ | ||
获取BaseOs() | Promise | ✅ | ✅ | ✅ | ||
获取构建Id() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取电池电量() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
获取引导加载程序() | Promise | ✅ | ||||
获取品牌() | string | ✅ | ✅ | ✅ | ✅ | |
获取构建编号() | string | ✅ | ✅ | ✅ | ✅ | |
获取BundleId() | string | ✅ | ✅ | ✅ | ✅ | |
isCameraPresent() | Promise | ✅ | ✅ | ✅ | ||
获取承运人() | Promise | ✅ | ✅ | |||
获取代码名称() | Promise | ✅ | ||||
获取设备() | Promise | ✅ | ||||
获取设备ID() | string | ✅ | ✅ | ✅ | ✅ | |
获取设备类型() | string | ✅ | ✅ | ✅ | ||
获取显示() | Promise | ✅ | ||||
获取设备名称() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取设备令牌() | Promise | ✅ | ✅ | |||
获取首次安装时间() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取指纹() | Promise | ✅ | ||||
获取字体比例() | Promise | ✅ | ✅ | ✅ | ||
获取空闲磁盘存储() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
getFreeDiskStorageOld() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
获取硬件() | Promise | ✅ | ||||
获取主机() | Promise | ✅ | ✅ | |||
获取主机名() | Promise | ✅ | ||||
获取IP地址() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取增量() | Promise | ✅ | ||||
获取安装程序包名称() | Promise | ✅ | ✅ | ✅ | ✅ | |
getInstallReferrer() | Promise | ✅ | ✅ | ✅ | ||
获取实例Id() | Promise | ✅ | ||||
获取最后更新时间() | Promise | ✅ | ||||
获取Mac地址() | Promise | ✅ | ✅ | ✅ | ||
获取制造商() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取最大内存() | Promise | ✅ | ✅ | ✅ | ||
获取模型() | string | ✅ | ✅ | ✅ | ✅ | |
获取电源状态() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
获取产品() | Promise | ✅ | ||||
getPreviewSdkInt() | Promise | ✅ | ||||
获取可读版本() | string | ✅ | ✅ | ✅ | ✅ | |
获取序列号() | Promise | ✅ | ✅ | |||
获取安全补丁() | Promise | ✅ | ||||
获取启动时间() | Promise | ✅ | ✅ | ✅ | ||
获取系统可用功能() | Promise | ✅ | ||||
获取系统名称() | string | ✅ | ✅ | ✅ | ✅ | |
获取系统版本() | string | ✅ | ✅ | ✅ | ✅ | |
获取标签() | Promise | ✅ | ||||
获取类型() | Promise | ✅ | ||||
获取磁盘总容量() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
getTotalDiskCapacityOld() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
获取总内存() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取唯一ID() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取已用内存() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
获取用户代理() | Promise | ✅ | ✅ | ✅ | ✅ | |
获取用户代理同步() | string | ✅ | ✅ | |||
获取版本() | string | ✅ | ✅ | ✅ | ✅ | |
获取亮度() | Promise | ✅ | ||||
有Gms() | Promise | ✅ | ||||
hasHms() | Promise | ✅ | ||||
hasNotch() | boolean | ✅ | ✅ | ✅ | ✅ | |
有动态岛() | boolean | ✅ | ✅ | ✅ | ✅ | |
有系统功能() | Promise | ✅ | ||||
isAirplaneMode() | Promise | ✅ | ✅ | |||
正在电池充电() | Promise | ✅ | ✅ | ✅ | ✅ | ✅ |
是模拟器() | Promise | ✅ | ✅ | ✅ | ✅ | |
isKeyboardConnected() | Promise | ✅ | ||||
isLandscape() | Promise | ✅ | ✅ | ✅ | ✅ | |
isLocationEnabled() | Promise | ✅ | ✅ | ✅ | ✅ | |
isMouseConnected() | Promise | ✅ | ||||
isHeadphonesConnected() | Promise | ✅ | ✅ | ✅ | ||
isWiredHeadphonesConnected() | Promise | ✅ | ✅ | ✅ | ||
isBluetoothHeadphonesConnected() | Promise | ✅ | ✅ | ✅ | ||
isPinOrFingerprintSet() | Promise | ✅ | ✅ | ✅ | ✅ | |
isTablet() | boolean | ✅ | ✅ | ✅ | ✅ | |
isLowRamDevice() | boolean | ✅ | ||||
isDisplayZoomed() | boolean | ✅ | ||||
isTabletMode() | Promise | ✅ | ||||
支持32BitAbis() | Promise | ✅ | ||||
支持64BitAbis() | Promise | ✅ | ||||
支持Abis() | Promise | ✅ | ✅ | ✅ | ✅ | |
同步唯一ID() | Promise | ✅ | ✅ | |||
获取支持的媒体类型列表() | Promise | ✅ |
获取API级别。
DeviceInfo . getApiLevel ( ) . then ( ( apiLevel ) => {
// iOS: ?
// Android: 25
// Windows: ?
} ) ;
查看 API 级别
获取 ANDROID_ID。请参阅 API 文档以了解正确的使用方式。
DeviceInfo . getAndroidId ( ) . then ( ( androidId ) => {
// androidId here
} ) ;
获取应用程序名称。
let appName = DeviceInfo . getApplicationName ( ) ;
// AwesomeApp
产品所基于的基本操作系统构建。
DeviceInfo . getBaseOs ( ) . then ( ( baseOs ) => {
// "Windows", "Android" etc
} ) ;
获取设备的电池电量(0 到 1 之间的浮点数)。
DeviceInfo . getBatteryLevel ( ) . then ( ( batteryLevel ) => {
// 0.759999
} ) ;
为了能够获得实际的电池电量,请启用应用程序的电池监控模式。添加此代码:
[UIDevice currentDevice ].batteryMonitoringEnabled = true ;
到 AppDelegate.m 应用程序:didFinishLaunchingWithOptions:
在 iOS 模拟器上返回 -1
系统引导加载程序版本号。
DeviceInfo . getBootloader ( ) . then ( ( bootloader ) => {
// "mw8998-002.0069.00"
} ) ;
获取设备品牌。
let brand = DeviceInfo . getBrand ( ) ;
// iOS: "Apple"
// Android: "xiaomi"
// Windows: ?
获取应用程序内部版本号。
let buildNumber = DeviceInfo . getBuildNumber ( ) ;
// iOS: "89"
// Android: "4"
// Windows: ?
获取应用程序包标识符。
let bundleId = DeviceInfo . getBundleId ( ) ;
// "com.example.AwesomeApp"
告知设备现在是否有摄像头。
DeviceInfo . isCameraPresent ( )
. then ( ( isCameraPresent ) => {
// true or false
} )
. catch ( ( cameraAccessException ) => {
// is thrown if a camera device could not be queried or opened by the CameraManager on Android
} ) ;
- 支持摄像机的热添加/删除。
- 返回相机物理存在的状态。如果相机存在,但您的应用程序无权使用它,isCameraPresent 仍将返回 true
获取运营商名称(网络运营商)。
DeviceInfo . getCarrier ( ) . then ( ( carrier ) => {
// "SOFTBANK"
} ) ;
当前的开发代号,或者字符串“REL”(如果这是发布版本)。
DeviceInfo . getCodename ( ) . then ( ( codename ) => {
// "REL"
} ) ;
工业品外观设计的名称。
DeviceInfo . getDevice ( ) . then ( ( device ) => {
// "walleye"
} ) ;
获取设备ID。
let deviceId = DeviceInfo . getDeviceId ( ) ;
// iOS: "iPhone7,2"
// Android: "goldfish"
// Windows: "Y3R94UC#AC4"
用于向用户显示的构建 ID 字符串。
DeviceInfo . getDisplay ( ) . then ( ( display ) => {
// "OPM2.171026.006.G1"
} ) ;
获取设备名称。
DeviceInfo . getDeviceName ( ) . then ( ( deviceName ) => {
// iOS: "Becca's iPhone 6"
// Android: ?
// Windows: ?
} ) ;
这曾经需要 android.permission.BLUETOOTH 但 v3 中的新实现不需要它。如果您有此 API,则可以从 AndroidManifest.xml 中删除它。 iOS 16 及更高版本需要有权访问用户定义的设备名称,否则将返回通用值(即“iPad”、“iPhone”)
获取设备令牌(请参阅DeviceCheck)。仅适用于真实设备上的 iOS 11.0+。当不支持 getDeviceToken 时,这将拒绝承诺,请小心异常处理。
DeviceInfo . getDeviceToken ( ) . then ( ( deviceToken ) => {
// iOS: "a2Jqsd0kanz..."
} ) ;
获取应用程序首次安装的时间(以毫秒为单位)。
DeviceInfo . getFirstInstallTime ( ) . then ( ( firstInstallTime ) => {
// Android: 1517681764528
} ) ;
唯一标识此构建的字符串。
DeviceInfo . getFingerprint ( ) . then ( ( fingerprint ) => {
// "google/walleye/walleye:8.1.0/OPM2.171026.006.G1/4820017:user/release-keys"
} ) ;
获取设备字体比例。字体比例是当前系统字体与“正常”字体大小的比率,因此如果普通文本为 10pt 而系统字体当前为 15pt,则字体比例将为 1.5 这可用于确定是否已进行辅助功能设置针对设备进行了更改;如果字体比例明显更大(> 2.0),您可能需要重新布局某些视图
DeviceInfo . getFontScale ( ) . then ( ( fontScale ) => {
// 1.2
} ) ;
获取可用存储大小(以字节为单位)的方法,同时考虑根文件系统和数据文件系统的计算。
在iOS上,此方法接受以下可选参数:
'total'
:使用volumeAvailableCapacityKey
'important'
:使用volumeAvailableCapacityForImportantUsageKey
'opportunistic'
:使用volumeAvailableCapacityForOpportunisticUsageKey
有关更多详细信息,请参阅有关检查卷存储容量的 Apple 文档。
DeviceInfo . getFreeDiskStorage ( ) . then ( ( freeDiskStorage ) => {
// Android: 17179869184
// iOS: 17179869184
} ) ;
DeviceInfo . getFreeDiskStorage ( 'important' ) . then ( ( freeDiskStorage ) => {
// iOS: 18198219342 (important storage)
} ) ;
此方法使用的 Android API 在 v6.0.0 中已更改。旧版本已在下面维护为getFreeDiskStorageOld()
。在 iOS 上, getFreeDiskStorage()
和getFreeDiskStorageOld()
返回相同的值。
获取可用存储大小(以字节为单位)的方法的旧实现。
DeviceInfo . getFreeDiskStorageOld ( ) . then ( ( freeDiskStorage ) => {
// Android: 17179869184
// iOS: 17179869184
} ) ;
来自developer.android.com:
此方法在 API 级别 29 中已弃用。
返回主要共享/外部存储目录。
注意:不要对这里的“外部”一词感到困惑。该目录可以更好地被视为媒体/共享存储。它是一个可以容纳相对大量数据并且在所有应用程序之间共享的文件系统(不强制执行权限)。传统上,这是一张 SD 卡,但它也可以实现为设备中的内置存储,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。
硬件的名称(来自内核命令行或/proc)。
DeviceInfo . getHardware ( ) . then ( hardware => {
// "walleye"
} ) ;
主机名
DeviceInfo . getHost ( ) . then ( ( host ) => {
// "wprd10.hot.corp.google.com"
} ) ;
已弃用获取设备当前的 IP 地址。 (仅限wifi)切换到react-native-netinfo/netinfo或react-native-network-info
DeviceInfo . getIpAddress ( ) . then ( ( ip ) => {
// "92.168.32.44"
} ) ;
0.22.0 中添加了对 iOS 的支持
底层源代码管理用来表示此构建的内部值。
DeviceInfo . getIncremental ( ) . then ( ( incremental ) => {
// "4820017"
} ) ;
底层源代码管理用来表示此构建的内部值。
DeviceInfo . getInstallerPackageName ( ) . then ( ( installerPackageName ) => {
// Play Store: "com.android.vending"
// Amazon: "com.amazon.venezia"
// Samsung App Store: "com.sec.android.app.samsungapps"
// iOS: "AppStore", "TestFlight", "Other"
} ) ;
在应用程序安装时获取引荐来源网址字符串。
DeviceInfo . getInstallReferrer ( ) . then ( ( installReferrer ) => {
// If the app was installed from https://play.google.com/store/apps/details?id=com.myapp&referrer=my_install_referrer
// the result will be "my_install_referrer"
} ) ;
获取应用程序实例 ID。
这会尝试按以下顺序从这些源获取实例 ID:
react-native-device-info
中键instanceId
下的值firebaseBomVersion
或firebaseIidVersion
-已弃用)googlePlayServicesIidVersion
或googlePlayServicesVersion
在 gradle ext 中定义 -已弃用)如果您使用的是已弃用的源,则生成的实例 ID 存储在共享首选项中,因此在 React-native-device-info 的主要版本中它将保持稳定。
在react-native-device-info的未来版本中,Firebase IID和GMS IID实现将被删除,所有未来值将是存储在SharedPreferences中的值(如果有),或者是一个新的随机UUID,然后将被存储并用于将来安装该应用程序。
DeviceInfo . getInstanceId ( ) . then ( ( instanceId ) => {
// Android: da4e0245-5d6c-402a-a07c-0c5349f229e2
} ) ;
请参阅 https://developers.google.com/instance-id/
获取应用程序上次更新的时间(以毫秒为单位)。
DeviceInfo . getLastUpdateTime ( ) . then ( ( lastUpdateTime ) => {
// Android: 1517681764992
} ) ;
获取网络适配器 MAC 地址。
DeviceInfo . getMacAddress ( ) . then ( ( mac ) => {
// "E5:12:D8:E5:69:97"
} ) ;
iOS:此方法始终返回“02:00:00:00:00:00”,因为自 iOS 7 以来已禁用检索 MAC 地址
获取设备制造商。
DeviceInfo . getManufacturer ( ) . then ( ( manufacturer ) => {
// iOS: "Apple"
// Android: "Google"
// Windows: ?
} ) ;
返回虚拟机将尝试使用的最大内存量(以字节为单位)。
DeviceInfo . getMaxMemory ( ) . then ( ( maxMemory ) => {
// 402653183
} ) ;
获取设备型号。
iOS 警告:包含设备名称的列表由社区维护,可能会滞后于新设备。建议使用getDeviceId()
因为它更可靠并且始终与新的 iOS 设备保持同步。我们确实接受拉取请求,将新的 iOS 设备添加到带有设备名称的列表中。
let model = DeviceInfo . getModel ( ) ;
// iOS: ?
// Android: ?
// Windows: ?
getPhoneNumber() 已被删除。此方法使用已弃用的 Android API。您可以使用react-native-sim-cards-manager来获取电话号码。
获取设备的电源状态,包括电池电量、是否已插入电源以及系统当前是否在低功耗模式下运行。如果未启用电池监控,或者尝试在模拟器上(无法进行监控),则在 iOS 上显示警告
DeviceInfo . getPowerState ( ) . then ( ( state ) => {
// {
// batteryLevel: 0.759999,
// batteryState: 'unplugged',
// lowPowerMode: false,
// }
} ) ;
整体产品的名称。
DeviceInfo . getProduct ( ) . then ( ( product ) => {
// "walleye"
} ) ;
预发布 SDK 的开发者预览版本。
DeviceInfo . getPreviewSdkInt ( ) . then ( ( previewSdkInt ) => {
// 0
} ) ;
获取应用程序的人类可读版本(与 getVersion() + '.' + getBuildNumber() 相同)
let readableVersion = DeviceInfo . getReadableVersion ( ) ;
// iOS: 1.0.1.32
// Android: 1.0.1.234
// Windows: ?
获取设备序列号。在几乎所有情况下都会“未知”,除非您有特权应用程序并且您知道自己在做什么。
DeviceInfo . getSerialNumber ( ) . then ( ( serialNumber ) => {
// iOS: unknown
// Android: ? (maybe a serial number, if your app is privileged)
// Windows: ? (a serial number, if your app has the "capability smbios")
} ) ;
如果你想在Windows中使用这种方法,你必须在你的应用程序中添加smbios功能。请按照本文档在清单文件中添加该功能。
用户可见的安全补丁级别。
DeviceInfo . getSecurityPatch ( ) . then ( ( securityPatch ) => {
// "2018-07-05"
} ) ;
获取设备操作系统名称。
let systemName = DeviceInfo . getSystemName ( ) ;
// iOS: "iOS" on newer iOS devices "iPhone OS" on older devices (including older iPad models), "iPadOS" for iPads using iPadOS 15.0 or higher.
// Android: "Android"
// Windows: ?
获取当前应用进程的启动时间(以毫秒为单位)。
DeviceInfo . getStartupTime ( ) . then ( ( startupTime ) => {
// Android: 1517681764528
// iOS: 1517681764528
} ) ;
获取设备操作系统版本。
let systemVersion = DeviceInfo . getSystemVersion ( ) ;
// iOS: "11.0"
// Android: "7.1.1"
// Windows: ?
获取操作系统的内部版本号。
DeviceInfo . getBuildId ( ) . then ( ( buildId ) => {
// iOS: "12A269"
// tvOS: not available
// Android: "13D15"
// Windows: not available
} ) ;
描述构建的逗号分隔标签。
DeviceInfo . getTags ( ) . then ( ( tags ) => {
// "release-keys, unsigned, debug",
} ) ;
构建类型。
DeviceInfo . getType ( ) . then ( ( type ) => {
// "user", "eng"
} ) ;
获取完整磁盘存储大小(以字节为单位)的方法,同时考虑根文件系统和数据文件系统的计算。
DeviceInfo . getTotalDiskCapacity ( ) . then ( ( capacity ) => {
// Android: 17179869184
// iOS: 17179869184
} ) ;
此方法使用的 Android API 在 v6.0.0 中已更改。旧版本已在下面维护为getTotalDiskCapacityOld()
。在 iOS 上, getTotalDiskCapacity()
和getTotalDiskCapacityOld()
返回相同的值。
获取完整磁盘存储大小(以字节为单位)的方法的旧实现。
DeviceInfo . getTotalDiskCapacityOld ( ) . then ( ( capacity ) => {
// Android: 17179869184
// iOS: 17179869184
} ) ;
获取设备总内存(以字节为单位)。
DeviceInfo . getTotalMemory ( ) . then ( ( totalMemory ) => {
// 1995018240
} ) ;
此标识符在某些应用商店(例如华为或 Google Play)中被视为敏感信息,如果未经用户同意或用于未经批准的目的而使用,可能会导致您的应用被删除或拒绝。有关更多信息,请参阅商店政策(请参阅下面的注释)。
获取设备唯一ID。在 Android 上,它目前与此模块中的getAndroidId()
相同。在 iOS 上,它使用DeviceUID
uid 标识符。在 Windows 上,它使用Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation.id
。
DeviceInfo . getUniqueId ( ) . then ( ( uniqueId ) => {
// iOS: "FCDBD8EF-62FC-4ECB-B2F5-92C9E79AC7F9"
// Android: "dd96dec43fb81c97"
// Windows: "{2cf7cb3c-da7a-d508-0d7f-696bb51185b4}"
} ) ;
- iOS:这是
IDFV
或随机字符串(如果 IDFV 不可用)。一旦生成 UID,它就会存储在 iOS Keychain 和 NSUserDefaults 中。因此,即使您删除应用程序或重置 IDFV,它也会保持不变。您可以仔细地认为它是一个持久的唯一ID。仅当有人手动覆盖 Keychain/NSUserDefaults 中的值或者 Apple 更改 Keychain 和 NSUserDefaults 实现时才可以更改它。请注意:IDFV 是使用您的捆绑包标识符计算的,因此在应用程序扩展中会有所不同。- android:在 Oreo 之前,一旦您设置手机,此 ID (ANDROID_ID) 将始终相同。
- android:Google Play 政策,请参阅“持久设备标识符”。华为-AppGallery审核指南参见“永久设备标识符”和“获得用户同意”。
此方法适用于 iOS。
这会将 uniqueId 与IDFV
同步或设置新的随机字符串。
在 iOS 上,它使用DeviceUID
uid 标识符。在其他平台上,它只是在此模块中调用getUniqueId()
。
DeviceInfo . syncUniqueId ( ) . then ( ( uniqueId ) => {
// iOS: "FCDBD8EF-62FC-4ECB-B2F5-92C9E79AC7F9"
// Android: "dd96dec43fb81c97"
// Windows: ?
} ) ;
- 如果用户将数据从一台 iOS 设备移动或恢复到第二台 iOS 设备,那么他将在 Keychain/NSUserDefaults 中拥有两个具有相同
uniqueId
的不同设备。用户可以在新的 iOS 设备上调用syncUniqueId()
。这将从IDFV
或随机字符串更新他的uniqueId
。
获取应用内存使用情况(以字节为单位)。
注意:此方法仅用于调试或构建面向用户的进程管理 UI。
DeviceInfo . getUsedMemory ( ) . then ( ( usedMemory ) => {
// 23452345
} ) ;
此方法获取支持的媒体编解码器列表。
DeviceInfo . getSupportedMediaTypeList ( ) . then ( ( string [ ] ) => {
// ["audio/mpeg", "audio/mp4a-latm", "audio/mp4a-latm", "audio/mp4a-latm", "audio/mp4a-latm", "video/avc", "video/3gpp", "video/hevc", "video/mp4v-es", "video/av01", "video/avc", "video/avc", "video/avc", "video/avc"]
} ) ;
获取设备用户代理。
DeviceInfo . getUserAgent ( ) . then ( ( userAgent ) => {
// iOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143"
// tvOS: not available
// Android: "Mozilla/5.0 (Linux; Android 12; sdk_gphone64_arm64 Build/SE1A.220630.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36"
// Windows: ?
} ) ;
获取应用程序版本。请考虑版本字符串是设备/操作系统格式的,并且可以包含任何附加数据(例如内部版本号等)。如果您想确定版本格式,可以使用正则表达式来获取返回版本字符串的所需部分。
let version = DeviceInfo . getVersion ( ) ;
// iOS: "1.0"
// Android: "1.0" or "1.0.2-alpha.12"
// Windows: ?
告知设备是否处于飞行模式。
DeviceInfo . isAirplaneMode ( ) . then ( ( airplaneModeOn ) => {
// false
} ) ;
- 仅当远程调试器被禁用时这才有效。
告知电池当前是否正在充电。
DeviceInfo . isBatteryCharging ( ) . then ( ( isCharging ) => {
// true or false
} ) ;
告知应用程序是否正在模拟器中运行。
DeviceInfo . isEmulator ( ) . then ( ( isEmulator ) => {
// false
} ) ;
告知设备是否已连接键盘。
let isKeyboardConnected = DeviceInfo . isKeyboardConnected ( ) ;
// true
告知是否为设备设置了 PIN 码或指纹。
DeviceInfo . isPinOrFingerprintSet ( ) . then ( ( isPinOrFingerprintSet ) => {
if ( ! isPinOrFingerprintSet ) {
// ...
}
} ) ;
判断设备是否为平板电脑。
let isTablet = DeviceInfo . isTablet ( ) ;
// true
告知设备 RAM 是否较低。
let isLowRamDevice = DeviceInfo . isLowRamDevice ( ) ;
// true
告知用户是否将“显示缩放”更改为“缩放”
let isDisplayZoomed = DeviceInfo . isDisplayZoomed ( ) ;
// true
告知设备是否处于平板电脑模式。
let isTabletMode = DeviceInfo . isTabletMode ( ) ;
// true
告知设备当前是否处于横向模式。
DeviceInfo . isLandscape ( ) . then ( ( isLandscape ) => {
// true
} ) ;
告知设备是否连接了鼠标。
let isMouseConnected = DeviceInfo . isMouseConnected ( ) ;
// true
告知设备是否支持 Google 移动服务。
DeviceInfo . hasGms ( ) . then ( ( hasGms ) => {
// true
} ) ;
告知设备是否支持华为移动服务。
DeviceInfo . hasHms ( ) . then ( ( hasHms ) => {
// true
} ) ;
告诉设备是否有凹口。
let hasNotch = DeviceInfo . hasNotch ( ) ;
// true
判断设备是否有动态岛。
let hasDynamicIsland = DeviceInfo . hasDynamicIsland ( ) ;
// true
以字符串形式返回设备的类型,该类型将是以下之一:
Handset
Tablet
Tv
Desktop
GamingConsole
Headset
unknown
let type = DeviceInfo . getDeviceType ( ) ;
// 'Handset'
该设备支持的 32 位 ABI 的有序列表。
DeviceInfo . supported32BitAbis ( ) . then ( ( abis ) => {
// ["armeabi-v7a", "armeabi"]
} ) ;
该设备支持的 64 位 ABI 的有序列表。
DeviceInfo . supported64BitAbis ( ) . then ( ( abis ) => {
// ["arm64-v8a"]
} ) ;
返回支持的处理器架构版本列表
DeviceInfo . supportedAbis ( ) . then ( ( abis ) => {
// [ "arm64 v8", "Intel x86-64h Haswell", "arm64-v8a", "armeabi-v7a", "armeabi", "win_x86", "win_arm", "win_x64" ]
} ) ;
告知设备是否具有特定的系统功能。
DeviceInfo . hasSystemFeature ( 'amazon.hardware.fire_tv' ) . then ( ( hasFeature ) => {
// true or false
} ) ;
返回 Android 上可用系统功能的列表。
DeviceInfo . getSystemAvailableFeatures ( ) . then ( ( features ) => {
// ["android.software.backup", "android.hardware.screen.landscape", "android.hardware.wifi", ...]
} ) ;
告知设备是否在设备级别关闭了位置服务(与应用程序特定的权限无关)
DeviceInfo . isLocationEnabled ( ) . then ( ( enabled ) => {
// true or false
} ) ;
告知设备是否连接到有线耳机或蓝牙耳机
DeviceInfo . isHeadphonesConnected ( ) . then ( ( enabled ) => {
// true or false
} ) ;
告知设备是否已连接到有线耳机
DeviceInfo . isWiredHeadphonesConnected ( ) . then ( ( enabled ) => {
// true or false
} ) ;
告知设备是否已连接至蓝牙耳机
DeviceInfo . isBluetoothHeadphonesConnected ( ) . then ( ( enabled ) => {
// true or false
} ) ;
返回特定于平台的位置提供商/服务的对象,带有boolean
值,无论它们当前是否可用。
注意:此功能需要获取Android上的位置权限
DeviceInfo . getAvailableLocationProviders ( ) . then ( ( providers ) => {
// {
// gps: true
// network: true
// passive: true
// }
} ) ;
DeviceInfo . getAvailableLocationProviders ( ) . then ( ( providers ) => {
// {
// headingAvailable: false
// isRangingAvailable: false
// locationServicesEnabled: true
// significantLocationChangeMonitoringAvailable: true
// }
} ) ;
获取设备主屏幕的当前亮度级别。目前仅限 iOS。返回 0.0 到 1.0 之间的数字(含 0.0 和 1.0)。
DeviceInfo . getBrightness ( ) . then ( ( brightness ) => {
// iOS: 0.6
} ) ;
支持 Windows、iOS 和 Android(电池/充电相关 API 的 Web 支持)。
当电池电量变化时触发;发送频率不超过每分钟一次。
import { useBatteryLevel } from 'react-native-device-info' ;
const batteryLevel = useBatteryLevel ( ) ; // 0.759999
< Text > { batteryLevel } < / Text > ;
import { NativeEventEmitter , NativeModules } from 'react-native' ;
const deviceInfoEmitter = new NativeEventEmitter ( NativeModules . RNDeviceInfo ) ;
deviceInfoEmitter . addListener ( 'RNDeviceInfo_batteryLevelDidChange' , ( level ) => {
// 0.759999
} ) ;
当电池电量低时触发(多次直至充电)
平台 | 百分比 |
---|---|
iOS系统 | 20 |
安卓 | 15 |
网络 | 20 |
视窗 | 20 |
import { useBatteryLevelIsLow } from 'react-native-device-info' ;
const batteryLevelIsLow = useBatteryLevelIsLow ( ) ; // 0.19
< Text > { batteryLevelIsLow } < / Text > ;
import { NativeEventEmitter , NativeModules } from 'react-native' ;
const deviceInfoEmitter = new NativeEventEmitter ( NativeModules . RNDeviceInfo ) ;
deviceInfoEmitter . addListener ( 'RNDeviceInfo_batteryLevelIsLow' , ( level ) => {
// 0.19
} ) ;
当电池状态发生变化或设备进入省电模式时触发,例如当设备进入充电模式或拔出插头时。
import { usePowerState } from 'react-native-device-info' ;
const powerState = usePowerState ( ) ;
// {
// batteryLevel: 0.759999,
// batteryState: 'unplugged',
// lowPowerMode: false,
// }
< Text > { powerState } < / Text > ;
import { NativeEventEmitter , NativeModules } from 'react-native'
const deviceInfoEmitter = new NativeEventEmitter ( NativeModules . RNDeviceInfo )
deviceInfoEmitter . addListener ( 'RNDeviceInfo_powerStateDidChange' , { powerState } = > {
// {
// batteryLevel: 0.759999,
// batteryState: 'unplugged',
// lowPowerMode: false,
// }
} ) ;
获取应用程序首次安装的时间(以毫秒为单位)。
import { useFirstInstallTime } from 'react-native-device-info' ;
const { loading , result } = useFirstInstallTime ( ) ; // { loading: true, result: 1517681764528}
< Text > { loading ? 'loading...' : result } < / Text > ;
获取设备名称。
import { useDeviceName } from 'react-native-device-info' ;
const { loading , result } = useDeviceName ( ) ; // { loading: true, result: "Becca's iPhone 6"}
< Text > { loading ? 'loading...' : result } < / Text > ;
告知设备是否具有特定的系统功能。
import { useHasSystemFeature } from 'react-native-device-info' ;
const { loading , result } = useHasSystemFeature ( 'amazon.hardware.fire_tv' ) ; // { loading: true, result: false }
< Text > { loading ? 'loading...' : result } < / Text > ;
获取应用程序是否正在模拟器中运行。
import { useIsEmulator } from 'react-native-device-info' ;
const { loading , result } = useIsEmulator ( ) ; // { loading: true, result: false }
< Text > { loading ? 'loading...' : result } < / Text > ;
获取设备制造商。
import { useManufacturer } from 'react-native-device-info' ;
const { loading , result } = useManufacturer ( ) ; // { loading: true, result: "Apple"}
< Text > { loading ? 'loading...' : result } < / Text > ;
告知设备是否连接到有线耳机或蓝牙耳机。
此挂钩订阅事件RNDeviceInfo_headphoneConnectionDidChange
,并相应地更新result
字段。
import { useIsHeadphonesConnected } from 'react-native-device-info' ;
const { loading , result } = useIsHeadphonesConnected ( ) ; // { loading: true, result: false}
< Text > { loading ? 'loading...' : result } < / Text > ;
告知设备是否已连接到有线耳机。
此挂钩订阅事件RNDeviceInfo_headphoneWiredConnectionDidChange
,并相应地更新result
字段。
import { useIsWiredHeadphonesConnected } from 'react-native-device-info' ;
const { loading , result } = useIsWiredHeadphonesConnected ( ) ; // { loading: true, result: false}
< Text > { loading ? 'loading...' : result } < / Text > ;
告知设备是否已连接至蓝牙耳机。
此挂钩订阅事件RNDeviceInfo_headphoneBluetoothConnectionDidChange
,并相应地更新result
字段。
import { useIsBluetoothHeadphonesConnected } from 'react-native-device-info' ;
const { loading , result } = useIsBluetoothHeadphonesConnected ( ) ; // { loading: true, result: false}
< Text > { loading ? 'loading...' : result } < / Text > ;
获取设备主屏幕的当前亮度级别。目前仅限 iOS。返回 0.0 到 1.0 之间的数字(含 0.0 和 1.0)。
该挂钩订阅事件RNDeviceInfo_brightnessDidChange
,并相应地更新brightness
字段。
import { useBrightness } from 'react-native-device-info' ;
const brightness = useBrightness ( ) ; // 0.46578987897654567
< Text > { brightness } < / Text > ;
import { NativeEventEmitter , NativeModules } from 'react-native' ;
const deviceInfoEmitter = new NativeEventEmitter ( NativeModules . RNDeviceInfo ) ;
deviceInfoEmitter . addListener ( 'RNDeviceInfo_brightnessDidChange' , ( brightness ) => {
// 0.46578987897654567
} ) ;
=======
如果需要从本机端检查设备类型,可以使用以下命令:
import com . learnium . resolver . DeviceTypeResolver
...
deviceTypeResolver = new DeviceTypeResolver ( context );
...
//Check if the device is a Tablet:
if ( deviceTypeResolver . isTablet ){
...
} else {
...
}
在安装或使用react-native-device-info
时,您可能会遇到以下问题:
react-native-device-info
使用com.google.android.gms:play-services-gcm
提供 getInstanceId()。这可能会导致构建 Android 应用程序时发生冲突。
如果您在应用程序中使用不同版本的com.google.android.gms:play-services-gcm
,您可以在build.gradle
文件中定义googlePlayServicesVersion
gradle 变量来告诉react-native-device-info
什么版本它应该需要。请参阅此处包含的示例项目以获取示例。
如果您使用与com.google.android.gms:play-services-gcm
冲突的不同库,并且您确定您知道自己在做什么,这样就可以避免版本冲突,您可以简单地忽略此依赖项你的 gradle 文件:
compile(project( ' :react-native-device-info ' )) {
exclude group : ' com.google.android.gms '
}
似乎是由react-native link
引起的错误。您可以在Xcode -> [Your iOS build target] -> Build Phrases -> Link Binary with Libraries
中手动删除libRNDeviceInfo-tvOS.a
。
这是系统级日志,可以通过执行以下命令关闭: xcrun simctl spawn booted log config --mode "level:off" --subsystem com.apple.CoreTelephony
。要撤消该命令,您可以执行: xcrun simctl spawn booted log config --mode "level:info" --subsystem com.apple.CoreTelephony
target 'yourTargetName' do
# See http://facebook.github.io/react-native/docs/integration-with-existing-apps.html#configuring-cocoapods-dependencies
pod 'React' , :path => '../node_modules/react-native' , :subspecs => [
'Core' ,
'CxxBridge' , # Include this for RN >= 0.47
'DevSupport' , # Include this to enable In-App Devmenu if RN >= 0.43
'RCTText' ,
'RCTNetwork' ,
'RCTWebSocket' , # Needed for debugging
'RCTAnimation' , # Needed for FlatList and animations running on native UI thread
# Add any other subspecs you want to use in your project
]
# Explicitly include Yoga if you are using RN >= 0.42.0
pod 'yoga' , :path => '../node_modules/react-native/ReactCommon/yoga'
# Third party deps podspec link - you may have multiple pods here, just an example
pod 'RNDeviceInfo' , path : '../node_modules/react-native-device-info'
end
# if you see errors about React duplicate definitions, this fixes it. The same works for yoga.
post_install do | installer |
installer . pods_project . targets . each do | target |
if target . name == "React"
target . remove_from_project
end
end
end
react-native-device-info
包含本机代码,需要进行模拟。不过,Jest Snapshot 支持可能会起作用。
如果您没有配置 Jest 安装文件,则应将以下内容添加到 Jest 设置中,并在项目根目录中创建 jest.setup.js 文件:
setupFiles: [ '/jest.setup.js' ] ;
然后,您应该将以下内容添加到 Jest 设置文件中以模拟 DeviceInfo 本机模块:
import mockRNDeviceInfo from 'react-native-device-info/jest/react-native-device-info-mock' ;
jest . mock ( 'react-native-device-info' , ( ) => mockRNDeviceInfo ) ;
查看示例项目以获取更多信息。
某些 API(例如 getBatteryState)会在某些情况下(例如在 tvOS 或 iOS 模拟器上)发出警告。这在生产中是不可见的,但即使在开发中也可能会令人恼火。发出警告很有用,因为这些设备不返回任何状态,这可能会令人惊讶,从而导致 github 支持问题。这些警告旨在教育您作为开发人员。如果警告很麻烦,您可以在代码中尝试以下方法来抑制它们:
import { LogBox } from 'react-native' ;
LogBox . ignoreLogs ( [ 'Battery state' ] ) ;
请参阅 CHANGELOG.md。
请参阅contributing guide
。
出于对开发人员的礼貌,该库在 v0.21.6 中通过提供一个空的 polyfill 来与react-native-dom和react-native-web兼容,以避免破坏构建。
只有 getUserAgent() 才会返回正确的值。所有其他 API 方法都将返回其记录的返回类型的“空”值: 0
表示数字, ''
表示字符串, false
表示布尔值。