在深入探讨之前,让我告诉大家--是的,我已经把Stack-Overflow上提供的所有可能的解决方案都看了一遍。
问题陈述 : 我无法用iPhone读取我的可用SIM卡的 "CarrierName"。
我试了什么: 我尝试了两种不同的解决方案,但我无法读取CarrierName。
解决方法1: 当我尝试这个解决方案时,我只收到了以下信息 "承运人" 作为输出,而不是CarrierName。
解决办法1:
//--------------- CodeBase : Solution1 -----------------
let networkInfo = CTTelephonyNetworkInfo()
let carrier = networkInfo.serviceSubscriberCellularProviders?.first?.value
if let carrierName = carrier?.carrierName {
cell.textLabel?.text = carrierName
}
else{
cell.textLabel?.text = "No Data"
}
//-------------------------------------------------------
输出 : 载波
解决方案2 : 当我尝试这个解决方案时,我收到了 "iPhone X" 作为输出,而不是CarrierName。
解决办法二:用Func : getCarrierName()代替CarrierName作为输出。
//--------------- CodeBase : Solution2 -----------------
let networkInfo = CTTelephonyNetworkInfo()
let carrier = networkInfo.serviceSubscriberCellularProviders?.first?.value
if var carrierName = carrier?.carrierName {
if carrierName.contains("Carrier"){
carrierName = self.getCarrierName() ?? "No Data"
}
else{
cell.textLabel?.text = carrierName
}
}
else{
cell.textLabel?.text = "No Data"
}
//-------------------------------------------------------
Func : getCarrierName()
//--------------- CodeBase : Part of Solution2 -----------------
func getCarrierName() -> String? {
var carrierName: String?
let typeName: (Any) -> String = { String(describing: type(of: $0)) }
let statusBar = UIApplication.shared.value(forKey: "_statusBar") as! UIView
for statusBarForegroundView in statusBar.subviews {
if typeName(statusBarForegroundView) == "UIStatusBarForegroundView" {
for statusBarItem in statusBarForegroundView.subviews {
if typeName(statusBarItem) == "UIStatusBarServiceItemView" {
carrierName = (statusBarItem.value(forKey: "_serviceString") as! String)
}
}
}
}
return carrierName
}
//-------------------------------------------------------
輸出 : iPhone X即返回ModelName而不是运营商名称。
谁能,帮我弄到CarrierName。
在我的案例中(Xcode 11.4, Swift 5.2, iPhone 8, iOS 13.3.1
),我可以得到正确的载体名称。
代码片段。
import CoreTelephony
if #available(iOS 12.0, *) {
if let providers = CTTelephonyNetworkInfo().serviceSubscriberCellularProviders {
providers.forEach { (key, value) in
print("key: \(key), carrier: \(value.carrierName ?? "nil")")
}
}
} else {
let provider = CTTelephonyNetworkInfo().subscriberCellularProvider
print("carrier: \(provider?.carrierName ?? "nil")")
}
控制台的结果是:
key: 0000000100000001, carrier: 中国电信