

subscriberCellularProviderがiOS12でdeprecatedになったので、  
serviceSubscriberCellularProvidersに代えたのですが、  
キャリアcarrierNameが取得できず困っています。

appleのドキュメントでは辞書型と書いてあるのでtest[“carrierName”]で取れると思うのですが、どこが間違っているのでしょうか。

[code]

    if let test = CTTelephonyNetworkInfo().serviceSubscriberCellularProviders{
      print(test)                //Ⅰ
      print(test[“carrierName”]) //Ⅱ
    }
    
[/code]

【debug window】

[code]

    //print Ⅰ
    ["~~": CTCarrier (~~) {
        Carrier name: [ソフトバンク]
        Mobile Country Code: [440]
        Mobile Network Code:[20]
        ISO Country Code:[jp]
        Allows VOIP? [YES]
    }
    ]
    
    //print Ⅱ
    nil
    
[/code]


CC BY-SA 4.0
2019-09-13T09:49:34.680
59042
2019-09-13T11:26:02.353
2019-09-13T11:22:12.697
3060
29300
question
swift
serviceSubscriberCellularProviderでcarrierNameが取得できません。


**print I** の出力、当方の環境では、次のようになりました。

>
[code]

>     ["0000000100000001": CTCarrier (0x2825fbe10) {
>         Carrier name: [ソフトバンク]
>         Mobile Country Code: [440]
>         Mobile Network Code:[20]
>         ISO Country Code:[jp]
>         Allows VOIP? [YES]
>     }
>     ]
>  
[/code]

特に秘密にしなければいけないような情報は見当たらないのに、なぜ`~~`のように情報を隠してしまうのでしょうか?
この辺りAppleのドキュメントはイマイチの分野でもあり、この手の情報を正確にお示しいただいた方が、早く解決につながることが多いです。

そのAppleのドキュメント:

##
[`serviceSubscriberCellularProviders`](https://developer.apple.com/documentation/coretelephony/cttelephonynetworkinfo/3024511-servicesubscribercellularprovide)

(抜粋)

>
[code]

>     Each entry in the dictionary is a CTCarrier object,
>  
[/code]

>
> 辞書の各エントリーは`CTCarrier`オブジェクトです。
[code]

>     the actual value of a key isn’t important,
>  
[/code]

>
> (辞書の)キーの実際の値は重要ではありません(訳注:「ですが…」と続きますが、今は無視)

つまりこの辞書の値は`"carrierName"`のようなキーで取れるとは一言も書いておらず、重要ではないキーに`CTCarrier`型の値がぶら下がっていると言うことです。

たとえばこんな風にしてみてください。

[code]

            if let providers = CTTelephonyNetworkInfo().serviceSubscriberCellularProviders {
                if let provider = providers.first {
                    print("key=\(provider.key)")
                    let carrier: CTCarrier = provider.value
                    print("Carrier name=\(carrier.carrierName ?? "?")")
                }
            }
    
[/code]

[`CTCarrier`のドキュメント](https://developer.apple.com/documentation/coretelephony/ctcarrier)を見れば、その他の情報をどうやれば取れるか、すぐにわかるかと思います。


CC BY-SA 4.0
2019-09-13T11:19:35.603
59046
2019-09-13T11:26:02.353
2019-09-13T11:26:02.353
13972
13972
59042
answer