2012-05-07 88 views
6

我正在使用本主題中的答案。 iPhone - how to determine carrier of the device (AT&T, Verizon, etc?),與getting operator details in iphone相同。雖然在使用SIM卡時工作正常,但如果沒有SIM卡,則返回的運營商名稱是舊運營商名稱。它未檢測到SIM被移除。iPhone - 檢測SIM卡可用性

我知道這與Apple文檔矛盾,如果沒有載體,CTCarrier對象應爲零。但在我的應用程序中,我登錄了運營商信息,它給了我最新的運營商名稱,雖然沒有安裝sim。

回答

7

按照documentation[CTCarrier carrierName]

如果配置設備的載體,然後取出SIM卡, 此屬性保留了承運人的名稱。

據我所知,你不能檢測是否安裝了SIM卡。您只能使用Reachability確定WWAN連接是否可用。

+1

這有助於但沒有解決這個問題。 WWAN連接可能不存在,但SIM卡可能仍然插入(如果用戶關閉數據和3G)。 –

+1

沒錯,並且無法檢查SIM卡是否存在。 –

+1

在您提供的相同文檔鏈接中,不能使用'mobileCountryCode'或'mobileNetworkCode'來檢測SIM是否存在?該文件指出,如果沒有SIM存在,這些值將是「無」。似乎並沒有保留這些屬性 – wnafee

4

CTCarrier對象有5個屬性:

allowsVOIP 
carrierName 
isoCountryCode 
mobileCountryCode 
mobileNetworkCode 

我做了關於CTCarrier一些測試,我得出的結論是,針對iOS 7 僅CARRIERNAME和allowsVOIP保留時取出卡。 isoCountryCode,mobileCountryCode和mobileNetworkCode在iOS 7中重置。這就是您可以檢測SIM是否存在的方式。

對於iOS 6,保留所有的值。

我進行使用iPhone 4S和iPhone 5都運行iOS 7的測試

6
@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; 
} 
0

斯威夫特版本:

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 

} 
+0

感謝您分享代碼。我不認爲它會檢測飛機模式。 –