Как проверить, может ли устройство совершать телефонный звонок (iOS 8)?

На iOS < 8 вы можете использовать функцию - (BOOL)canOpenURL:(NSURL *)url.

В iOS 8 эта функция возвращает YES, даже на iPad. Я предполагаю, что это связано с вызовом Wi-Fi (или другой новой функциональностью), но мой iPad не может звонить по телефону. Кто-нибудь знает лучший способ обнаружить эту возможность?

Ответ 1

Хорошо, поэтому я столкнулся с одной и той же проблемой. Кажется, iPad и iPod возвращают значение YES для метода canOpenURL. Пожалуйста, см. Мой ответ ниже, поскольку это сработало для меня. У меня была специальная ячейка просмотра коллекции, и именно поэтому этот код был в моем файле awakeFromNib. Однако вы должны написать этот код в ViewDidLoad этого perticular viewController.

Обязательно включите "CoreTelephony.Framework" в свой проект.

Включите в контроллер вида следующие файлы:

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

    - (void)awakeFromNib {
    // Initialization code

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]) {
        // Check if iOS Device supports phone calls
        CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
        CTCarrier *carrier = [netInfo subscriberCellularProvider];
        NSString *mnc = [carrier mobileNetworkCode];
        // User will get an alert error when they will try to make a phone call in airplane mode.
        if (([mnc length] == 0)) {
            // Device cannot place a call at this time.  SIM might be removed.
        } else {
            // iOS Device is capable for making calls
        }
    } else {
        // iOS Device is not capable for making calls
    }



    if ( ! [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"sms:"]]) {
       // iOS Device is not capable to send SMS messages. 
    }
}

Ответ 2

Этот код возвращает NO на iPad iOS 8 Simulator. Я действительно задаюсь вопросом, подключен ли iPad к iPhone под управлением iOS 8 через тот же идентификатор Apple, если функция телефонного вызова непрерывности сделает этот возврат YES. Но это не доступно на данный момент в сборке GM, поэтому он всегда должен возвращать NO на iPad и iPod Touch.

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"telprompt://"]]

Ответ 3

Вы можете просто посмотреть, есть ли это iPhone. И, возможно, используйте это в сочетании с - (BOOL)canOpenURL:(NSURL *)url. Таким образом вы избегаете устройств, которые, очевидно, не могут совершать сотовый телефон.

if ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"] ) {
     // Make Phone Call
}