Как узнать, может ли устройство Cocoa Touch совершать звонки?

Возможный дубликат:
iOS – Определение того, поддерживает ли устройство телефонные звонки?

Я пишу приложение для iPhone, которое предоставляет кнопку для вызова телефонного номера. Я использую следующий код для набора номера с помощью URL-адреса tel: обычным способом:

NSURL* contactTelURL = [NSURL
                        URLWithString:[NSString
                                       stringWithFormat:@"tel:%@",
                                       contactTel]];
[[UIApplication sharedApplication] openURL:contactTelURL];

Он отлично работает на реальном iPhone, но я просто получаю предупреждение «Неподдерживаемый URL» в симуляторе. Предположительно, это также произойдет на iPod Touch, хотя я этого не проверял. Было бы неплохо убрать кнопку при работе на устройстве, которое не будет звонить.

Есть ли способ программно определить, может ли устройство Cocoa Touch совершать телефонные звонки?


person Will Harris    schedule 24.05.2009    source источник


Ответы (4)


Вы можете запросить [[UIDevice currentDevice] model] и проверить, является ли это iPhone.

person henning77    schedule 24.05.2009
comment
Это не предпочтительное решение. Вы должны проверить, какие возможности есть у устройства, а не тестировать конкретную модель. Смотрите ответ neilkimmett. - person Mads Mobæk; 21.12.2010
comment
Это неправильный ответ, этот вопрос является дубликатом, а правильный ответ приведен здесь: stackoverflow.com/questions/5094928/ - person Andrew Johnson; 09.10.2012
comment
Это не говорит вам, может ли устройство совершать вызовы (т. е. у него есть SIM-карта, находится в сети и т. д.). - person ToddB; 11.06.2014
comment
@MadsMobæk Вы в основном имеете в виду, что вам следует выполнять проверку API, чтобы узнать, доступен ли API для телефонных звонков, а затем позвонить, если это так? - person Supertecnoboff; 23.08.2015

От Ноа Уизерспуна на странице Позвонить из моего приложения для iPhone

симулятор не поддерживает многие схемы URL-адресов iOS, в том числе для приложений Phone, Maps, Youtube и SMS. Это также относится к таким устройствам, как iPod touch и iPad, у которых нет функций телефона; перед использованием какой-либо схемы URL-адресов через -openURL: вы должны проверить поддержку этой схемы с помощью -canOpenURL:, который вернет YES или NO в зависимости от того, поддерживает ли текущее устройство используемую вами схему URL-адресов.

Поэтому запросите [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]], чтобы узнать, может ли устройство совершать звонки.

person neilkimmett    schedule 27.08.2010
comment
это правильный ответ для меня. Всегда следует проверять -[UIApplication canOpenURL] перед вызовом -[UIApplication openURL] - person tony.tc.leung; 18.09.2013
comment
Это возвращает TRUE на моем iPad 2 под управлением iOS8.1. Однако на симуляторе 8.1 он возвращает FALSE. Так что это не работает на реальном устройстве. - person FranticRock; 14.01.2015
comment
Может быть, это как-то связано с функцией непрерывности, добавленной в iOS 8? - person Scott; 05.05.2015

Из iphonedevelopment.blogspot.com

#import <sys/utsname.h>

enum {
    MODEL_IPHONE_SIMULATOR,
    MODEL_IPOD_TOUCH,
    MODEL_IPHONE,
    MODEL_IPHONE_3G
};

@interface DeviceDetection : NSObject

+ (uint) detectDevice;
+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator;

@end


@implementation DeviceDetection

+ (uint) detectDevice {
    NSString *model= [[UIDevice currentDevice] model];

    // Some iPod Touch return "iPod Touch", others just "iPod"

    NSString *iPodTouch = @"iPod Touch";
    NSString *iPodTouchLowerCase = @"iPod touch";
    NSString *iPodTouchShort = @"iPod";

    NSString *iPhoneSimulator = @"iPhone Simulator";

    uint detected;

    if ([model compare:iPhoneSimulator] == NSOrderedSame) {
        // iPhone simulator
        detected = MODEL_IPHONE_SIMULATOR;
    } else if ([model compare:iPodTouch] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else if ([model compare:iPodTouchLowerCase] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else if ([model compare:iPodTouchShort] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else {
        // Could be an iPhone V1 or iPhone 3G (model should be "iPhone")
        struct utsname u;

        // u.machine could be "i386" for the simulator, "iPod1,1" on iPod Touch, "iPhone1,1" on iPhone V1 & "iPhone1,2" on iPhone3G

        uname(&u);

        if (!strcmp(u.machine, "iPhone1,1")) {
            detected = MODEL_IPHONE;
        } else {
            detected = MODEL_IPHONE_3G;
        }
    }
    return detected;
}


+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator {
    NSString *returnValue = @"Unknown";

    switch ([DeviceDetection detectDevice]) {
        case MODEL_IPHONE_SIMULATOR:
            if (ignoreSimulator) {
                returnValue = @"iPhone 3G";
            } else {
                returnValue = @"iPhone Simulator";
            }
            break;
        case MODEL_IPOD_TOUCH:
            returnValue = @"iPod Touch";
            break;
        case MODEL_IPHONE:
            returnValue = @"iPhone";
            break;
        case MODEL_IPHONE_3G:
            returnValue = @"iPhone 3G";
            break;
        default:
            break;
    }        
    return returnValue;
}

@end
person Kriem    schedule 24.05.2009

Вот простой фрагмент кода, который я использую, чтобы убедиться, что модель устройства является телефоном, а не симулятором, чтобы убедиться, что оно может совершать звонки.

if ([[[UIDevice currentDevice] model] rangeOfString:@"Phone"].location != NSNotFound &&
    [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location == NSNotFound ) {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", number]  ] ];
}
person Josh Peak    schedule 12.04.2011