[英]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.