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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:30:39