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

iOS中如何通过CoreTelephony获取SIM卡国家代码?iOS16兼容方案求助

iOS 16+ 从SIM卡获取国家代码的解决方案

原代码的核心问题

你原代码中每次循环都创建新的CTTelephonyNetworkInfo实例,导致serviceCurrentRadioAccessTechnology的key与serviceSubscriberCellularProviders的key不匹配——每个实例生成的服务key是独立的,因此无法正确关联到对应的CTCarrier数据。此外,isoCountryCode在iOS 16已被官方废弃,系统不再返回该字段。

兼容iOS 12-15的修复代码

先修复实例复用问题,在iOS 15及以下版本仍可正常获取:

if #available(iOS 12.0, *) {
    let networkInfo = CTTelephonyNetworkInfo()
    guard let radioTechs = networkInfo.serviceCurrentRadioAccessTechnology,
          let carriers = networkInfo.serviceSubscriberCellularProviders else {
        print("No cellular provider data")
        return
    }
    
    radioTechs.keys.forEach { serviceKey in
        if let carrier = carriers[serviceKey] {
            let code = carrier.isoCountryCode ?? "no data"
            print(code)
        }
    }
}

iOS 16+ 专属替代方案

针对iOS 16及以上版本,有两种可靠方式获取国家代码:

1. 使用新增的countryCode属性

iOS 16为CTCarrier新增了countryCode属性,直接返回ISO 3166-1 alpha-2格式的国家代码,无需额外转换:

if #available(iOS 16.0, *) {
    let networkInfo = CTTelephonyNetworkInfo()
    guard let carriers = networkInfo.serviceSubscriberCellularProviders else {
        print("No cellular provider data")
        return
    }
    
    carriers.values.forEach { carrier in
        let code = carrier.countryCode ?? "no data"
        print(code)
    }
}

2. 通过mobileCountryCode映射(兼容全版本)

如果需要同时兼容iOS 16以下版本,可使用mobileCountryCode(MCC,3位数字代码),通过预定义映射表转换为ISO国家代码:

// 基础MCC到ISO代码映射表(可根据业务需求补充更多条目)
private let mccToIsoMap: [String: String] = [
    "460": "CN",  // 中国
    "310": "US",  // 美国
    "234": "GB",  // 英国
    "222": "IT",  // 意大利
    "250": "RU",  // 俄罗斯
    "505": "AU"   // 澳大利亚
]

if #available(iOS 12.0, *) {
    let networkInfo = CTTelephonyNetworkInfo()
    guard let carriers = networkInfo.serviceSubscriberCellularProviders else {
        print("No cellular provider data")
        return
    }
    
    carriers.values.forEach { carrier in
        if let mcc = carrier.mobileCountryCode {
            let isoCode = mccToIsoMap[mcc] ?? "unknown"
            print(isoCode)
        } else {
            print("no data")
        }
    }
}

关键注意事项

  • 必须在Info.plist中添加NSCellularNetworkUsageDescription键,填写向用户说明使用蜂窝网络信息的原因,否则系统会阻止应用获取相关数据
  • 多SIM卡设备需遍历serviceSubscriberCellularProviders的所有value,处理每张SIM卡的信息
  • 若设备无SIM卡、处于飞行模式或蜂窝网络未激活,所有CTCarrier字段都会返回nil

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:12:54