我正在使用本主题中的答案。iPhone - 如何确定设备的运营商(AT&T、Verizon 等?) ,这与在 iphone 中获取运营商详细信息相同。虽然使用 SIM 卡时可以正常工作,但如果没有 SIM 卡,则返回的运营商名称是旧的运营商名称。它不会检测到 SIM 已被移除。
我知道这与 Apple 文档相矛盾,即如果没有载体,则 CTCarrier 对象应为零。但是在我的应用程序中,我记录了运营商信息,它给了我最新的运营商名称,尽管没有安装 sim。
我正在使用本主题中的答案。iPhone - 如何确定设备的运营商(AT&T、Verizon 等?) ,这与在 iphone 中获取运营商详细信息相同。虽然使用 SIM 卡时可以正常工作,但如果没有 SIM 卡,则返回的运营商名称是旧的运营商名称。它不会检测到 SIM 已被移除。
我知道这与 Apple 文档相矛盾,即如果没有载体,则 CTCarrier 对象应为零。但是在我的应用程序中,我记录了运营商信息,它给了我最新的运营商名称,尽管没有安装 sim。
根据以下文档[CTCarrier carrierName]
:
如果您为运营商配置设备,然后移除 SIM 卡,此属性将保留运营商的名称。
据我所知,您无法检测到是否安装了 SIM 卡。您只能使用 确定 WWAN 连接是否可用Reachability
。
@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 时,仅保留运营商名称和 allowVOIP。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
}
希望对你有帮助:</p>
if #available(iOS 12.0, *) {
return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
} else {
if let _ = CTTelephonyNetworkInfo().subscriberCellularProvider?.isoCountryCode {
return true
} else {
return false
}
}
斯威夫特 5.4 答案
接受的答案已过时或不正确。
protocol SimCardServiceProtocol {
var isAvailableSIM: Bool { get }
}
final class SimCardService: SimCardServiceProtocol {
var isAvailableSIM: Bool {
return CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.mobileNetworkCode != nil
}
}