iPhone – 检测SIM卡的可用性

我正在使用这个主题的答案。 iPhone – 如何确定设备的运营商(AT&T,Verizon等?) ,这是相同的得到运营商的细节在iPhone 。 虽然使用SIM卡时工作正常,但如果没有SIM卡,返回的运营商名称是旧的运营商名称。 它没有检测到SIM卡被移除。

我知道这与苹果的文档相矛盾,如果没有载体,CTCarrier对象应该是零。 但在我的应用程序中,我login了运营商信息,它给了我最新的运营商名称,虽然没有安装SIM卡。

根据[CTCarrier carrierName]的文件 :

如果您为运营商configuration设备,然后取出SIM卡,则此属性将保留运营商的名称。

据我所知,你不能检测是否安装了SIM卡。 只能使用Reachability确定WWAN连接是否可用。

 @import CoreTelephony; -(BOOL)hasCellularCoverage { CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new]; CTCarrier *carrier = [networkInfo subscriberCellularProvider]; if (!carrier.isoCountryCode) { NSLog(@"No sim present Or No cellular coverage or phone is on airplane mode."); return NO; } return YES; } 

CTCarrier对象有5个属性:

 allowsVOIP carrierName isoCountryCode mobileCountryCode mobileNetworkCode 

我已经做了一些关于CTCarrier的testing,我得出的结论是,对于iOS 7, 只有carrierName和allowedVOIP在SIM被移除时被保留 。 isoCountryCode,mobileCountryCode和mobileNetworkCode在iOS 7中重置。您可以通过这种方式检测SIM是否存在。

对于iOS 6,所有的值都保留。

我使用运行iOS 7的iPhone 4S和iPhone 5执行testing。

Swift版本:

 func hasCellularCoverage() -> Bool { let networkInfo = CTTelephonyNetworkInfo() guard let info = networkInfo.subscriberCellularProvider else {return false} if let carrier = info.isoCountryCode { print("No sim present Or No cellular coverage or phone is on airplane mode. Carrier = \(carrier)"); return true } return false } 

要么

 func hasCellularCoverage() -> Bool { let networkInfo = CTTelephonyNetworkInfo() guard let info = networkInfo.subscriberCellularProvider else {return false} return info.isoCountryCode != nil ? true : false }