Cómo saber si el dispositivo de Cocoa Touch puede hacer llamadas? [duplicar]
-
05-09-2019 - |
Pregunta
Duplicar posible:
- detectar si el dispositivo soporta llamadas telefónicas
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 también sucedería en un iPod Touch, aunque no he probado eso. Sería bueno para quitar el botón cuando se ejecuta en un dispositivo que no va a hacer llamadas.
¿Hay una manera de detectar si un dispositivo mediante programación Cocoa Touch puede hacer llamadas telefónicas?
Solución
Se puede consultar [[UIDevice currentDevice] model]
, y comprobar si se trata de un iPhone.
Otros consejos
A partir de Noah Witherspoon en realizar una llamada desde mi aplicación iPhone
el simulador no es compatible con una gran cantidad de esquemas de URL de iOS, incluyendo aquellos para el teléfono, Maps, 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í [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]
consulta
para averiguar si el dispositivo puede realizar llamadas.
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
Aquí es un simple fragmento de código que utilizo para comprobar el modelo de dispositivo es un teléfono y no un simulador para asegurarse de que puede 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] ] ];
}