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

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]
 }
  ]    )

原因分析

  1. iOS 16 隐私权限限制:iOS 16起,获取运营商信息必须申请NSCellularNetworkUsageDescription权限,未添加该权限时系统会限制数据访问,返回默认占位值。
  2. 双卡设备服务ID匹配问题:双卡设备的serviceSubscriberCellularProviders会返回多个服务ID对应的CTCarrier对象,部分ID可能对应未激活卡槽或虚拟服务,导致无效数据。
  3. 网络注册延迟:应用启动时立即获取信息,可能蜂窝网络尚未完成注册,返回临时无效值。

解决方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:24:58