11

我正在使用本主题中的答案。iPhone - 如何确定设备的运营商(AT&T、Verizon 等?) ,这与在 iphone 中获取运营商详细信息相同。虽然使用 SIM 卡时可以正常工作,但如果没有 SIM 卡,则返回的运营商名称是旧的运营商名称。它不会检测到 SIM 已被移除。

我知道这与 Apple 文档相矛盾,即如果没有载体,则 CTCarrier 对象应为零。但是在我的应用程序中,我记录了运营商信息,它给了我最新的运营商名称,尽管没有安装 sim。

4

6 回答 6

12

根据以下文档[CTCarrier carrierName]

如果您为运营商配置设备,然后移除 SIM 卡,此属性将保留运营商的名称。

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

于 2012-05-07T20:59:52.557 回答
9
@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;
}
于 2015-01-13T12:52:14.690 回答
8

CTCarrier对象有 5属性:

allowsVOIP
carrierName
isoCountryCode
mobileCountryCode
mobileNetworkCode

我已经对 CTCarrier 进行了一些测试,我得出的结论是,对于 iOS 7 ,在移除 SIM 时,仅保留运营商名称和 allowVOIP。isoCountryCode、mobileCountryCode 和 mobileNetworkCode 为 iOS 7 重置。这就是您可以检测 SIM 卡是否存在的方法。

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

我使用运行 iOS 7 的 iPhone 4S 和 iPhone 5 进行了测试。

于 2013-12-16T13:15:13.333 回答
1

斯威夫特版本:

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

}
于 2016-06-29T19:21:59.377 回答
1

希望对你有帮助:</p>

    if #available(iOS 12.0, *) {
        return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
    } else {
        if let _ = CTTelephonyNetworkInfo().subscriberCellularProvider?.isoCountryCode {
            return true
        } else {
            return false
        }
    }
于 2021-07-30T09:51:50.510 回答
0

斯威夫特 5.4 答案

接受的答案已过时或不正确。

protocol SimCardServiceProtocol {
    var isAvailableSIM: Bool { get }
}

final class SimCardService: SimCardServiceProtocol {

    var isAvailableSIM: Bool {
        return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
    }
}
于 2021-07-14T07:29:41.730 回答