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

StackOverflow https://stackoverflow.com/questions/903961

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

От Ноя Уизерспуна в Совершить звонок из приложения "Мой iPhone"

симулятор не поддерживает многие схемы URL-адресов iOS, в том числе для приложений Phone, Maps, Youtube и SMS.Это также относится к таким устройствам, как iPod touch и iPad, которые не имеют телефонных возможностей;прежде чем использовать какую-либо схему URL через -openURL: , вы должны проверить наличие поддержки для этой схемы с помощью -canOpenURL: , которая вернет YES или NO в зависимости от того, поддерживает ли текущее устройство схему 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]  ] ];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top