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

