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
相关产品推荐
相关产品推荐

