iPhone - 检测SIM卡是否可用

11
我正在使用这个主题中的答案:iPhone-如何确定设备的运营商(AT&T,Verizon等),与在iPhone中获取运营商详情相同。尽管在使用sim卡时工作正常,但如果没有SIM卡,则返回的载体名称是旧的载体名称。它无法检测到SIM已被移除。
我知道这与苹果文档相矛盾,即如果没有运营商,则CTCarrier对象应为nil。但在我的应用程序中,我记录了运营商信息,并且即使没有安装sim,它也会给我最新的运营商名称。
6个回答

12
根据[CTCarrier carrierName]文档

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

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

1
这有所帮助,但并没有解决问题。WWAN连接可能不存在,但SIM卡仍然可能已插入(如果用户关闭了数据和3G)。 - Abdalrahman Shatou
2
对,而且没有办法检查SIM卡是否存在。 - Evan Mulawski
2
在您提供的同一文档链接中,无法使用 mobileCountryCodemobileNetworkCode 来检测 SIM 卡是否存在吗?文档说明如果没有 SIM 卡,则这些值将为 nil。似乎这些属性并未保留。 - wnafee
很遗憾,情况并非总是如此,因为除非在移除SIM卡后重新启动设备,否则这些值将被保留。但是,不同的iOS版本可能会有所不同。 - Evan Mulawski

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

8

CTCarrier对象有5个属性:

allowsVOIP
carrierName
isoCountryCode
mobileCountryCode
mobileNetworkCode

我进行了一些关于CTCarrier的测试,得出结论:对于iOS 7,当SIM卡被移除时,只有carrierName和allowsVOIP保留下来。isoCountryCode、mobileCountryCode和mobileNetworkCode都会重置。这就是你可以检测SIM卡是否存在的方法。

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

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


1

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

    return true

}

or

func hasCellularCoverage() -> Bool {

    let networkInfo = CTTelephonyNetworkInfo()

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

    return info.isoCountryCode != nil ? false : true

}

1
希望这可以帮到你:
    if #available(iOS 12.0, *) {
        return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
    } else {
        if let _ = CTTelephonyNetworkInfo().subscriberCellularProvider?.isoCountryCode {
            return true
        } else {
            return false
        }
    }

记得添加 "import CoreTelephony"。 - Adekola Akano

0

Swift 5.4 答案

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

protocol SimCardServiceProtocol {
    var isAvailableSIM: Bool { get }
}

final class SimCardService: SimCardServiceProtocol {

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接