如何使用Expo获取SIM卡的ICC ID并在应用中展示?
使用Expo获取SIM卡ICC ID的解决方案
现状说明
- Expo官方的
expo-cellular库确实未提供获取ICC ID的API,原因是ICC ID属于敏感设备信息,苹果和安卓的系统权限政策对这类信息的获取有严格限制,且Expo Managed Workflow为保证跨平台兼容性,未暴露相关接口。
可行方案
1. 切换到Expo Bare Workflow
若你的项目可以切换到Bare模式,可通过原生代码实现ICC ID获取,并通过Native Module暴露给JS端调用。
安卓端实现
- 首先在
AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- 创建Native Module类(例如
IccIdModule.kt):
package com.yourprojectname import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import android.content.Context import android.Manifest import android.content.pm.PackageManager import android.telephony.TelephonyManager class IccIdModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { override fun getName(): String { return "IccIdModule" } @ReactMethod fun getIccId(): String? { val telephonyManager = reactApplicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager return if (reactApplicationContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { telephonyManager.simSerialNumber } else { null } } }
- 在
MainApplication.kt中注册Module:
import com.yourprojectname.IccIdModule class MainApplication : Application(), ReactApplication { // ... 其他代码 override fun getPackages(): List<ReactPackage> { return PackageList(this).packages.apply { add(object : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> { return listOf(IccIdModule(reactContext)) } override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> { return emptyList() } }) } } }
- JS端调用示例:
import { NativeModules } from 'react-native'; import { PermissionsAndroid } from 'react-native'; const { IccIdModule } = NativeModules; const fetchIccId = async () => { const permissionStatus = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE ); if (permissionStatus === PermissionsAndroid.RESULTS.GRANTED) { const iccId = await IccIdModule.getIccId(); console.log('获取到的ICC ID:', iccId); // 将iccId展示到应用UI中 } else { console.log('权限被拒绝,无法获取ICC ID'); } };
iOS端说明
iOS从iOS 10开始,普通应用无法获取完整ICC ID,苹果限制了该权限,仅获得特殊授权的企业应用可尝试获取。普通应用只能获取到模糊的部分信息,或完全无法获取。
2. Managed Workflow替代方案
若无法切换到Bare模式,目前没有可靠的官方/第三方Expo插件支持获取ICC ID,可考虑:
- 引导用户手动输入ICC ID(可从SIM卡卡槽、运营商APP或实体SIM卡上获取)
- 若业务允许,使用其他合规的设备标识替代(需注意隐私合规要求)
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

