簡體   English   中英

iPhone - 檢測 SIM 卡的可用性

[英]iPhone - Detecting SIM card availability

我正在使用本主題中的答案。 iPhone - 如何確定設備的運營商(AT&T、Verizon 等?) ,這與在 iphone 中獲取運營商詳細信息相同。 雖然使用sim卡可以正常工作,但是如果沒有SIM卡,返回的運營商名稱是舊的運營商名稱。 它不會檢測到 SIM 已被移除。

我知道這與 Apple 文檔相矛盾,即如果沒有運營商,則 CTCarrier 對象應為零。 但是在我的應用程序中,我記錄了運營商信息,雖然沒有安裝 SIM 卡,但它給了我最新的運營商名稱。

根據[CTCarrier carrierName]文檔

如果您為運營商配置設備,然后移除 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 進行了一些測試,我得出的結論是,對於 iOS 7 移除 SIM 卡時僅會保留carrierName 和 allowedVOIP isoCountryCode、mobileCountryCode 和 mobileNetworkCode 已針對 iOS 7 重置。這就是您可以檢測 SIM 是否存在的方法。

對於 iOS 6,保留所有值。

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

迅捷版:

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 false
    }

    return true

}

要么

func hasCellularCoverage() -> Bool {

    let networkInfo = CTTelephonyNetworkInfo()

    guard let info = networkInfo.subscriberCellularProvider else {return false}

    return info.isoCountryCode != nil ? false : true

}

斯威夫特 5.4 答案

接受的答案已過時或不正確。

protocol SimCardServiceProtocol {
    var isAvailableSIM: Bool { get }
}

final class SimCardService: SimCardServiceProtocol {

    var isAvailableSIM: Bool {
        return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
    }
}

希望這可以幫助:

    if #available(iOS 12.0, *) {
        return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
    } else {
        if let _ = CTTelephonyNetworkInfo().subscriberCellularProvider?.isoCountryCode {
            return true
        } else {
            return false
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM