iOS获取运营商名称返回--与65535的问题求助
iOS 16 获取运营商信息返回 "--" 和 65535 的原因及解决办法
问题重现
用户使用Objective-C和Swift代码尝试获取运营商信息,设备搭载物理SIM卡且未连接WiFi,SIM卡功能正常,但返回结果始终为carrierName="--"、mobileCountryCode=65535、mobileNetworkCode=65535。
Objective-C 代码
CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init]; CTCarrier* carrier = info.subscriberCellularProvider; NSString *mobileCountryCode = carrier.mobileCountryCode; NSString *carrierName = carrier.carrierName; NSString *isoCountryCode = carrier.isoCountryCode; NSString *mobileNetworkCode = carrier.mobileNetworkCode;
Objective-C 日志输出
2023-05-22 16:47:39.831078+0700 MotionTrade[7686:985518] carrier name = -- 2023-05-22 16:47:39.831260+0700 MotionTrade[7686:985518] mobileCountryCode = 65535 2023-05-22 16:47:39.831342+0700 MotionTrade[7686:985518] mobileNetworkCode = 65535
Swift 代码
override func viewDidLoad() { super.viewDidLoad() let networkInfo = CTTelephonyNetworkInfo() let carrierName = networkInfo.serviceSubscriberCellularProviders dump(carrierName) }
Swift 日志输出
Optional(["0000000100000001": CTCarrier (0x281275d10) { Carrier name: [--] Mobile Country Code: [65535] Mobile Network Code:[65535] ISO Country Code:[--] Allows VOIP? [YES] } , "0000000100000002": CTCarrier (0x28126ca20) { Carrier name: [--] Mobile Country Code: [65535] Mobile Network Code:[65535] ISO Country Code:[--] Allows VOIP? [YES] } ] )
原因分析
- iOS 16 隐私权限限制:iOS 16起,获取运营商信息必须申请
NSCellularNetworkUsageDescription权限,未添加该权限时系统会限制数据访问,返回默认占位值。 - 双卡设备服务ID匹配问题:双卡设备的
serviceSubscriberCellularProviders会返回多个服务ID对应的CTCarrier对象,部分ID可能对应未激活卡槽或虚拟服务,导致无效数据。 - 网络注册延迟:应用启动时立即获取信息,可能蜂窝网络尚未完成注册,返回临时无效值。
解决方法
1. 添加隐私权限描述
在Info.plist中添加NSCellularNetworkUsageDescription键,说明应用访问蜂窝信息的用途:
<key>NSCellularNetworkUsageDescription</key> <string>需要获取运营商信息以提供适配的网络服务</string>
2. 正确处理双卡设备的服务ID
遍历服务提供商时过滤无效数据,或监听网络状态变更通知获取活跃服务的运营商信息:
import CoreTelephony class ViewController: UIViewController { private let networkInfo = CTTelephonyNetworkInfo() override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(carrierInfoDidChange), name: NSNotification.Name.CTServiceRadioAccessTechnologyDidChange, object: nil) carrierInfoDidChange() } @objc private func carrierInfoDidChange() { guard let providers = networkInfo.serviceSubscriberCellularProviders else { return } for (serviceId, carrier) in providers { if carrier.mobileCountryCode != "65535" && !(carrier.carrierName ?? "").isEmpty { print("服务ID: \(serviceId), 运营商名称: \(carrier.carrierName ?? "未知"), MCC: \(carrier.mobileCountryCode ?? "未知"), MNC: \(carrier.mobileNetworkCode ?? "未知")") } } } }
3. 延迟获取或监听网络状态
避免在viewDidLoad中立即获取,延迟几秒或监听网络就绪后再获取:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init]; CTCarrier* carrier = info.subscriberCellularProvider; // 处理运营商数据 });
4. 验证SIM卡网络注册状态
前往设备「设置」-「蜂窝网络」-「蜂窝数据选项」,确认SIM卡已激活并正常注册网络,部分地区需手动切换到4G/5G模式才能正确返回信息。
内容的提问来源于stack exchange,提问作者afi permana
相关产品推荐
相关产品推荐

