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


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

Я пишу приложение для iPhone, которое предоставляет кнопку для вызова телефонного номера. Я использую код, подобный следующему, чтобы набрать номер, используя URL tel: обычным способом:
NSURL* contactTelURL = [NSURL
                        URLWithString:[NSString
                                       stringWithFormat:@"tel:%@",
                                       contactTel]];
[[UIApplication sharedApplication] openURL:contactTelURL];

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

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

4 ответа:

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

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

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

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

Из 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

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

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