使用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可用)
- 配置权限:在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> - 动态申请权限+获取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
相关产品推荐
相关产品推荐

