2009-05-24 12 views
7

Duplicar posible:
iOS - Detecting whether or not device support phone calls?¿Cómo saber si el dispositivo Cocoa Touch puede hacer llamadas?

estoy escribiendo una aplicación de iPhone que proporciona un botón para llamar a un número de teléfono. Estoy usando un código como el siguiente para marcar el número usando una URL tel: de la forma habitual:

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

Funciona bien en un iPhone real, pero me acaba de obtener una alerta 'no compatible URL' en el simulador. Es de suponer que eso también ocurriría en un iPod Touch, aunque no lo he probado. Sería bueno quitar el botón cuando se ejecuta en un dispositivo que no hará llamadas.

¿Existe alguna manera de detectar programáticamente si un dispositivo Cocoa Touch puede hacer llamadas telefónicas?

Respuesta

-1

Puede consultar [[UIDevice currentDevice] model] y comprobar si se trata de un iPhone.

+5

Esta no es la solución preferida. Debe verificar qué capacidades tiene el dispositivo, en lugar de probar para un modelo específico. Ver la respuesta de Neilkimmett. –

+0

Esta es la respuesta incorrecta, esta pregunta es un duplicado, y la respuesta correcta se proporciona aquí: http://stackoverflow.com/questions/5094928/ios-detecting-whether-or-not-device-support-phone-calls –

+0

Esto no le dice si el dispositivo puede realizar una llamada (es decir, tiene una tarjeta SIM, está en una red, etc.) – ToddB

7

De 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 
40

De Noah Witherspoon en Make a call from my iPhone application

el simulador no es compatible con una gran cantidad de esquemas de URL de iOS, incluyendo los del teléfono, mapas, YouTube y aplicaciones SMS . Este es también el caso de dispositivos como el iPod touch y el iPad, que no tienen capacidades de teléfono; antes de usar cualquier esquema de URL a través de -openURL :, usted debe comprobar la compatibilidad de este régimen utilizando -canOpenURL :, que devolverá SÍ o NO dependiendo de si el dispositivo actual es compatible con el esquema de URL que está utilizando

Así consulta [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]] para averiguar si el dispositivo puede realizar llamadas.

+1

esta es la respuesta correcta para mí. Siempre debe verificar - [UIApplication canOpenURL] antes de llamar - [UIApplication openURL] –

+0

Esto está regresando VERDADERO en mi iPad 2 con iOS8.1. En el simulador 8.1, sin embargo, está volviendo FALSO. Entonces esto no funciona en el dispositivo real. – Alex

+0

Quizás eso tiene algo que ver con la función de continuidad agregada en iOS 8? – Scott

0

Aquí hay un fragmento de código simple que utilizo para verificar que el modelo del dispositivo sea un teléfono y no un simulador para asegurarse de que pueda realizar llamadas.

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