在React Native中获取设备ID?

13

如何在React Native中获取设备ID。我正在使用Create React Native,而不是Android Studio。我对此很陌生。

import DeviceInfo from 'react-native-device-info';

constructor(props) {
 super(props);
   this.state = { id: '' }
   this.onNavigateTo = this.onNavigateTo.bind(this);   
}
componentDidMount() {
   this.setState({id: DeviceInfo.getUniqueID()}, () =>      
   alert(this.state.id));
}
render() {
  return (
       <Text>{this.state.id}</Text>
  );
}

错误:未定义对象(在评估“RNDevice.uniqueId”时)

注意:- 我没有使用run-android或run-ios

我正在使用Create-react-native应用程序和yarn start。 输出将通过Expo应用程序显示在设备上


你运行了 link 命令吗? - LYu
是的,步骤1:npm install --save react-native-device-info;步骤2:react-native link react-native-device-info。 - user1731387
你尝试过清理Yarn缓存吗?不确定是否有帮助,但人们说如果再次运行react-native run-ios,它会解决问题,因为你正在使用Yarn,也许也可以尝试这样做。 - LYu
是的,让我试试看! - user1731387
不行,不起作用吗? - user1731387
尝试完全停止您的启动器,重置缓存、链接和构建。感觉如果你一直玩它,最终你会让它工作,顺便说一下,这里是线程 https://github.com/rebeccahughes/react-native-device-info/issues/137 - LYu
5个回答

17

你可以使用react-native CLI创建项目,而不是使用expo。

使用以下命令创建新项目:

react-native init Myproject

cd Myproject

使用以下命令运行项目:

react-native run-android

那么您可以使用 react-native-device-info 包。

我尝试了以下版本,对我来说可行。

  "react": "16.0.0",
  "react-native": "0.50.4",
  "react-native-device-info": "^0.12.1",

我用命令安装了它:

npm install --save react-native-device-info

然后我使用命令将其链接:

react-native link react-native-device-info

如果在链接软件包时遇到任何问题,您可以手动进行链接,或者可以交叉检查软件包是否已成功链接。

  1. 在android/app/build.gradle文件中:
 dependencies {
        ...
        compile "com.facebook.react:react-native:+"  // From node_modules
    +   compile project(':react-native-device-info')
    }
  1. 在android/settings.gradle中:

...

包含 ':app'

包含 ':react-native-device-info'

project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android')

  1. 在MainApplication.java中:
+ import com.learnium.RNDeviceInfo.RNDeviceInfo;

  public class MainApplication extends Application implements ReactApplication {
    //......

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
+         new RNDeviceInfo(),
          new MainReactPackage()
      );
    }

    ......
  }

权限

在AndroidManifest.xml中添加适当的可选权限:

...
<uses-permission android:name="android.permission.BLUETOOTH"/>         <!-- for Device Name -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>  <!-- for Phone Number -->

示例

var DeviceInfo = require('react-native-device-info');
// or import DeviceInfo from 'react-native-device-info';

var deviceId = DeviceInfo.getUniqueID();

您可以使用以上设备ID。


注意:getUniqueID可能无法为设备返回真正的唯一标识符。根据文档,它返回SDK中的ANDROID_ID变量,这个值在已root的手机、出厂重置甚至普通情况下都可能发生变化(制造商已报告同一ID用于来自两个不同制造商的2部不同手机)。 - Rahly

8
如果你在使用Expo,请尝试以下操作。
import Constants from 'expo-constants';
this.clientId = Constants.deviceId;

2
这在 Expo SDK 44 上不起作用。 - Or Nakash

6

如果您想使用本地代码,就不能使用使用原生代码的库,参见caveats。如果要使用本地代码,需要使用本地代码创建项目,请参阅doc

  1. 安装必备应用程序(Node - Java Development Kit - Android Studio - Xcode - React Native CLI)
  2. 运行命令react-native init MyProjectName
  3. 转到项目文件夹cd MyProjectName
  4. 运行react-native run-androidreact-native run-ios

如果您想将Expo项目转换为本地代码项目,则可以执行ejecting-from-create-react-native-app

  1. 安装与本地代码相关的要求,如上所述
  2. 运行npm run eject

之后您可以使用使用本地代码的第三方库,并运行react-native link


对我来说,它已经成功构建了,但在设备上却告诉我同样的问题。 - user1731387
我正在获取,但是只有在构建之后才能获取到ID。 - user1731387

3
如果您的目标是获取客户端唯一ID,则可以使用NativeModules
在您的组件中导入:Import { NativeModules } from 'react-native'...
对于iOS: console.log(NativeModules.SettingsManager.clientUniqueId) 对于Android: console.log(NativeModules.PlatformConstants.fingerprint);(或NativeModules.PlatformConstants.serial)。

NativeModules.SettingsManager.clientUniqueId 返回未定义 - Sebastian Oscar Lopez
API可能已经改变(因为它们总是这样做),或者可能出现了问题,请使用console.log(NativeModules.SettingsManager)以便您可以了解选项。 - Matheus Barradas

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接