Detecting whether or not device support phone calls?

后端 未结 9 2136
别跟我提以往
别跟我提以往 2020-11-28 23:13

Is the below code reliable to be used to determine whether a device can support phone calls or not? My concern is if apple changes the iphone string to anything else let\'s

相关标签:
9条回答
  • 2020-11-29 00:04

    Simply checking if a device "supports" phone calls might not be the best way to go about things depending on what your trying to accomplish. Believe it or not, some people use old iPhones without service as if they were an iPod Touch. Sometimes people don't have SIM cards installed in their iPhones. In my app I wanted to dial a phone number if the users device was able to, otherwise I wanted to display the phone number and prompt the user to grab a phone and dial it. Here is a solution I came up with that has worked so far. Feel free to comment and improve it.

    // You must add the CoreTelephony.framework
    #import <CoreTelephony/CTTelephonyNetworkInfo.h>
    #import <CoreTelephony/CTCarrier.h>
    
    -(bool)canDevicePlaceAPhoneCall {
        /*
    
         Returns YES if the device can place a phone call
    
         */
    
        // Check if the device can place a phone call
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]) {
            // Device supports phone calls, lets confirm it can place one right now
            CTTelephonyNetworkInfo *netInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
            CTCarrier *carrier = [netInfo subscriberCellularProvider];
            NSString *mnc = [carrier mobileNetworkCode]; 
            if (([mnc length] == 0) || ([mnc isEqualToString:@"65535"])) {
                // Device cannot place a call at this time.  SIM might be removed.
                return NO;
            } else {
                // Device can place a phone call
                return YES;
            }
        } else {
            // Device does not support phone calls
            return  NO;
        }
    }
    

    You'll notice I check if the mobileNetworkCode is 65535. In my testing, it appears that when you remove the SIM card, then the mobileNetworkCode is set to 65535. Not 100% sure why that is.

    0 讨论(0)
  • 2020-11-29 00:07

    In case you are asking in order to call a phone number and show an error on devices that have no telephony:

    void openURL(NSURL *url, void (^ __nullable completionHandler). (BOOL success))
    {
        if (@available(iOS 10.0, *)) {
            [application openURL:url options:@{} completionHandler:^(BOOL success) {
                completionHandler(success);
            }];
        } else
        {
            if([application openURL:url]) {
                completionHandler(YES);
            } else {
                completionHandler(NO);
            }
        }
    }
    

    usage

            p97openURL(phoneURL, ^(BOOL success) {
                if(!success) {
                      show message saying there is no telephony on device
    
                }
            }
    
    0 讨论(0)
  • 2020-11-29 00:08

    I think that generally it is. I would go for a more generic string comparison (just to be safer in case of a future update). I've used it with no problems (so far...).

    If you want to be more certain about whether the device can actually make calls, you should also take advantage of the Core Telephony API. The CTCarrier class can tell you whether you can actually make a call at any particular moment.

    0 讨论(0)
提交回复
热议问题