Pergunta

Duplicate possíveis:
iOS -? detectar se ou não telefonemas de apoio de dispositivo

Eu estou escrevendo um aplicativo para iPhone que fornece um botão para chamar um número de telefone. Eu estou usando um código como o seguinte para discar o número usando uma URL tel: da forma habitual:

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

Ele funciona muito bem em um iPhone real, mas eu apenas obter um alerta 'não suportado URL' no simulador. Presumivelmente, que também iria acontecer em um iPod Touch, embora eu não testei isso. Seria bom para remover o botão quando executado em um dispositivo que não vai fazer chamadas.

Existe uma maneira de detectar programaticamente se um dispositivo Cocoa Touch pode fazer chamadas telefônicas?

Foi útil?

Solução

Você pode consultar [[UIDevice currentDevice] model], e verificar se ele é um iPhone.

Outras dicas

De Noah Witherspoon em Fazer uma chamada do meu aplicativo iPhone

o simulador não suporta um monte de esquemas de URL do iOS, incluindo aqueles para o telefone, Maps, Youtube, e aplicativos através de SMS. Este é também o caso de dispositivos como o iPod touch eo iPad, que não têm capacidades de telefone; antes de usar qualquer esquema de URL via -openURL :, você deve verificar se há suporte para esse sistema usando -canOpenURL :, que voltará SIM ou NÃO, dependendo se o dispositivo atual suporta o esquema de URL que você está usando

Assim [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]] consulta para descobrir se o dispositivo pode fazer chamadas.

A partir 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

Aqui está um código simples snippet eu uso para verificar o modelo do dispositivo é um telefone e não um simulador para se certificar de que pode fazer chamadas.

if ([[[UIDevice currentDevice] model] rangeOfString:@"Phone"].location != NSNotFound &&
    [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location == NSNotFound ) {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", number]  ] ];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top