如何在iOS系统中使用Swift4程序化读取SIM卡运营商名称?

问题描述 投票:0回答:1

在深入探讨之前,让我告诉大家--是的,我已经把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。

ios swift iphone swift4.2
1个回答
0
投票

在我的案例中(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: 中国电信
© www.soinside.com 2019 - 2024. All rights reserved.