Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

subscriberCellularProvider was deprecated in iOS 12.0

I'm trying to make a list carrier with subscriberCellularProvider. But I got one problem which is "'subscriberCellularProvider' was deprecated in iOS 12.0: Replaced by serviceSubscriberCellularProviders"

I'm using XCode 11.4.1 and iOS 13. Anybody can help me to solve this problem?

like image 420
Hanan Hakim Avatar asked May 07 '20 23:05

Hanan Hakim


3 Answers

The warning is telling you that you should use CTTelephonyNetworkInfo().serviceSubscriberCellularProviders instead, that returns an optional dictionary of type [String : CTCarrier]?. Probably is added to support devices with multiple sim (eg. iPhone XR with SIM + eSIM)

I can't figure out which key to use with the dictionary, in my case (iPhone 8) I have only one object with key 0000000100000001 so I get the carrier with:

CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?["0000000100000001"]

You could try with:

CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value

but obviously there’s not guarantee that you will get the same info between different executions of your app.

I couldn't find any further documentation about it

like image 138
Andr3a88 Avatar answered Oct 06 '22 15:10

Andr3a88


'subscriberCellularProvider' is deprecated: first deprecated in iOS 12.0 Replace 'subscriberCellularProvider' with 'serviceSubscriberCellularProviders'

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>


CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];

NSDictionary<NSString *, CTCarrier *> *providers= [networkInfo serviceSubscriberCellularProviders];
                
CTCarrier *carrier = providers.allValues.firstObject;
                
NSString* isoCountryCode = carrier.isoCountryCode;
                
NSString* mobileNetworkCode = carrier.mobileNetworkCode;
                
NSString* mobileCountryCode = carrier.mobileCountryCode;
                
NSString* carrierName = carrier.carrierName;
            
like image 43
Haseeb Javed Avatar answered Oct 06 '22 16:10

Haseeb Javed


@Andr3a88 's answer is not precise. For iPhone with 2 SIM cards CTTelephonyNetworkInfo().serviceSubscriberCellularProviders returns at least 2 elements one of them may have carrier as this

CTCarrier (0x283d8e940) {
    Carrier name: [<nil>]
    Mobile Country Code: [<nil>]
    Mobile Network Code:[<nil>]
    ISO Country Code:[<nil>]
    Allows VOIP? [YES]

for non-used eSIM I guess.

So it is preferable to check if carrier name is not NIL

let netInfo = CTTelephonyNetworkInfo()
let carrier = netInfo.serviceSubscriberCellularProviders?.filter({ $0.value.carrierName != nil }).first?.value
like image 29
Alexey Ishkov Avatar answered Oct 06 '22 14:10

Alexey Ishkov