可能的方式来检测iOS中的SIM卡检测?

我有一个iPhone应用程序,有能力发送消息。 我想提醒用户,当SIM卡在iphone中不可用。 所以我试了下面三个函数来检查sim卡的可用性

Class messageClass = (NSClassFromString(@"MFMessageComposeViewController")); if([messageClass canSendText]){ // Sim available NSLog(@"Sim available"); } else{ //Sim not available NSLog(@"Sim not available"); } if([MFMessageComposeViewController canSendText]){ // Sim available NSLog(@"Sim available"); } else{ //Sim not available NSLog(@"Sim not available"); } if([[UIDevice currentDevice].model isEqualToString:@"iPhone"]) { if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel:123456"]]) { NSLog(@"Sim available"); } else { NSLog(@"Sim not available"); } } 

我已经检查了我的iPhone没有SIM卡,它总是返回@“SIM卡可用”。 但是,当我打开默认的“消息”应用程序,并尝试发送短信说警报“没有SIM卡安装”…这个消息应用程序可以检测到SIM卡的可用性?

通过下面的代码,你可以得到SIM卡的详细信息,如运营商名称,mobilecountrycode,isocountrycode,mobilenetworkcode.In在iOS 6中都保留。所以如果你的SIM卡被删除也将保留旧的细节。所以这个想法不会有用但在ios 7中,只有运营商名称被保留,剩余部分被更改,因此可以使用下面的代码

 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 // Try this to track CTCarrier changes info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier* inCTCarrier) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"User did change SIM"); }); }; 

你可以通过CTCarrier类来检查它。

在这里输入图像说明

 BOOL isSimCardAvailable = YES; CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init]; CTCarrier* carrier = info.subscriberCellularProvider; if(carrier.mobileNetworkCode == nil || [carrier.mobileNetworkCode isEqualToString:@""]) { isSimCardAvailable = NO; } 

您需要添加使用CTTelephonyNetworkInfo和CTCarrier的CoreTelephony框架。

对Anneq和Felipe的补充答案是:

Swift 2.3:

 import CoreTelephony func isSimAvailable() -> Bool { let info = CTTelephonyNetworkInfo() let carr = info.subscriberCellularProvider guard let carrier = carr else { return false } guard let carrierCode = carrier.mobileNetworkCode else { return false } guard carrierCode != "" else { return false } return true } 

作为只读计算属性在Swift中实现:

 import CoreTelephony var availableSIM: Bool { return CTTelephonyNetworkInfo().subscriberCellularProvider?.mobileNetworkCode != nil } 

作为Anneq Anwar答案的补充,这里的快速版本:

 import CoreTelephony func isSimAvailable() -> Bool { var isSimCardAvailable = true var info = CTTelephonyNetworkInfo() var carrier = info.subscriberCellularProvider if carrier != nil && carrier.mobileNetworkCode == nil || carrier.mobileNetworkCode.isEqual("") { isSimCardAvailable = false } return isSimCardAvailable } 

修复:在某些设备中,运营商可能是零