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

Xcode14.3中获取mobileCountryCode返回65535而非国家代码字符串问题

问题:获取SIM运营商国家代码得到65535而非预期的US/FR这类代码

我尝试从设备SIM运营商获取mobileCountryCode,当前得到的结果为6553565535,而预期应为US或FR这类国家代码。以下是我使用的Objective-C代码:

CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = nil;
// The CTTelephonyNetworkInfo.serviceSubscriberCellularProviders method crash because of an issue in iOS 12.0
// It was fixed in iOS 12.1
if (@available(iOS 12, *)) {
    NSDictionary<NSString *, CTCarrier *> *carriers = nil;
    if (@available(iOS 12.1, *)) {
        carriers = [networkInfo serviceSubscriberCellularProviders];
    } else {
        carriers = [networkInfo valueForKey:@"serviceSubscriberCellularProvider"];
    }
    if (carriers != nil) {
        for (NSString *key in carriers) {
            carrier = carriers[key];
            NSLog(@"isoCountryCode : %@", carrier.isoCountryCode.description);
        }
    }
} else {
    carrier = [networkInfo subscriberCellularProvider];
}

NSString *codeInfo = @"";
if (carrier != nil && carrier.mobileCountryCode != nil) {
    codeInfo = [carrier.mobileCountryCode stringByAppendingString:carrier.mobileNetworkCode];
}

NSLog(@"countryCode: %@", codeInfo.description);

打印输出如下:

Carrier name: [--]
Mobile Country Code: [65535]
Mobile Network Code:[65535]
ISO Country Code:[--]
Allows VOIP? [YES]

当前使用Xcode14.3。


原因分析

65535是iOS系统中表示未知/无效的移动国家代码(MCC)和移动网络代码(MNC)占位符,出现这个值通常意味着系统无法从SIM卡或蜂窝网络获取有效运营商信息。另外你混淆了两个关键字段:

  • mobileCountryCode:数字格式的国家代码(例如美国为310)
  • isoCountryCode:才是你预期的两位字母代码(例如US、FR)

修复步骤

1. 确认测试环境与设备状态

  • 必须使用真机测试,模拟器无法模拟真实SIM卡的运营商信息
  • 检查设备是否插入有效SIM卡,飞行模式是否关闭,且能正常连接蜂窝网络
  • 确保App的蜂窝数据权限已开启(设置→蜂窝网络→对应App→允许蜂窝数据)

2. 修正代码逻辑

(1)获取正确的ISO国家代码

调整代码以直接获取你需要的两位字母国家代码:

NSString *codeInfo = @"";
if (carrier != nil) {
    // 优先获取字母格式的国家代码
    if (carrier.isoCountryCode != nil) {
        codeInfo = carrier.isoCountryCode;
    } 
    // 若需要数字MCC+MNC,保留原逻辑
    else if (carrier.mobileCountryCode != nil) {
        codeInfo = [carrier.mobileCountryCode stringByAppendingString:carrier.mobileNetworkCode];
    }
}

NSLog(@"countryCode: %@", codeInfo);

(2)优化多SIM卡处理逻辑

原代码遍历多SIM卡时,最后一个carrier会覆盖之前的结果,建议筛选有效运营商(排除无效占位符):

if (carriers != nil) {
    for (NSString *key in carriers) {
        CTCarrier *currentCarrier = carriers[key];
        // 筛选有有效信息的运营商
        if (currentCarrier.isoCountryCode && ![currentCarrier.mobileCountryCode isEqualToString:@"65535"]) {
            carrier = currentCarrier;
            NSLog(@"isoCountryCode : %@", carrier.isoCountryCode);
            // 找到有效数据后跳出循环,避免被无效数据覆盖
            break;
        }
    }
}

3. 简化iOS版本适配

Xcode14.3对应的iOS版本通常为iOS16及以上,无需再兼容iOS12.0的崩溃问题,可简化代码:

CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = nil;

if (@available(iOS 12.1, *)) {
    NSDictionary<NSString *, CTCarrier *> *carriers = networkInfo.serviceSubscriberCellularProviders;
    if (carriers != nil) {
        for (NSString *key in carriers) {
            CTCarrier *currentCarrier = carriers[key];
            if (currentCarrier.isoCountryCode && ![currentCarrier.mobileCountryCode isEqualToString:@"65535"]) {
                carrier = currentCarrier;
                break;
            }
        }
    }
} else {
    carrier = networkInfo.subscriberCellularProvider;
}

// 后续处理逻辑...

内容的提问来源于stack exchange,提问作者Kodr.F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:47:05