You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Expo开发React Native应用,如何读取手机IMEI号?

获取Expo开发的React Native应用的IMEI号方案

核心结论

Expo的**托管工作流(Managed Workflow)**无法直接获取IMEI——IMEI属于敏感硬件标识符,Android/iOS系统权限限制严格,且Expo核心SDK未提供相关API,你尝试的react-native-device-info在托管模式下也无法获取该信息(因为需要自定义原生配置)。

如果必须获取IMEI,只能切换到裸工作流(Bare Workflow),但iOS端即使是裸工作流也无法获取(苹果从iOS 10开始禁止第三方APP读取IMEI)。


裸工作流下的Android端实现(仅Android可用)

  1. 配置权限:在AndroidManifest.xml中添加权限声明:
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
  2. 动态申请权限+获取IMEI:使用react-native-device-info结合权限申请:
    import DeviceInfo from 'react-native-device-info';
    import { PermissionsAndroid } from 'react-native';
    
    const fetchIMEI = async () => {
      try {
        const permissionGranted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE,
          {
            title: "设备信息权限申请",
            message: "为完成功能需要获取您的设备IMEI",
            buttonPositive: "允许",
            buttonNegative: "取消"
          }
        );
    
        if (permissionGranted === PermissionsAndroid.RESULTS.GRANTED) {
          const imei = await DeviceInfo.getImei();
          return imei;
        } else {
          console.log("读取IMEI权限被拒绝");
          return null;
        }
      } catch (error) {
        console.error("获取IMEI失败:", error);
        return null;
      }
    };
    

无需切换工作流的替代方案

如果不想切换到裸工作流,可以使用Expo官方提供的expo-device库获取合规的设备标识符:

import * as Device from 'expo-device';

const getAlternativeDeviceId = () => {
  // 应用级匿名标识符,卸载应用后重置
  const appDeviceId = Device.deviceId;
  // Android专属设备级标识符(非IMEI)
  const androidDeviceId = Device.androidId;

  return { appDeviceId, androidDeviceId };
};

关键注意事项

  • iOS平台完全无法获取IMEI,苹果系统严格限制第三方APP访问该敏感信息,只能使用IDFA、UUID等合规标识符替代
  • 获取任何设备标识符都需遵守隐私法规(如GDPR、个人信息保护法),必须明确告知用户用途并获得同意

内容的提问来源于stack exchange,提问作者Amila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:22