Как программно прочитать имя SIM-карты в iOS с помощью Swift4 - PullRequest
0 голосов
/ 23 апреля 2020

Прежде чем углубляться в детали, позвольте мне рассказать вам все это - да, я рассмотрел все возможные решения, предоставляемые в Stack-Overflow.

Постановка проблемы: Я не могу прочитать 'CarrierName' моей доступной SIM-карты, используя iPhone

Что я пытался: Я пробовал два разных решения, но не могу прочитать 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.

Решение 2:

//--------------- 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"
            }
//-------------------------------------------------------

Fun c: 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

Может кто-нибудь, пожалуйста, помогите мне получить CarrierName.

1 Ответ

0 голосов
/ 23 апреля 2020

В моем случае (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: 中国电信
...