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 | ✅ | ✅ | ✅ | ✅ | |
取得安裝引用者() | 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 | ✅ | ||||
是風景() | 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
表示布林值。