realidad - API para determinar si se ejecuta en iPhone o iPad
itunes (5)
Esta pregunta ya tiene una respuesta aquí:
- iOS detecta si el usuario está en un iPad 15 respuestas
¿Hay una API para verificar en tiempo de ejecución si está ejecutando un iPhone o un iPad?
Una forma en que puedo pensar sería usar:
[[UIDevice currentDevice] model];
Y detectar la existencia de la cadena @ "iPad", que parece un poco frágil.
En el 3.2 SDK, veo que UIDevice
también tiene una propiedad que es realmente lo que estoy buscando, pero que no funciona para pre-3.2 (obviamente):
[[UIDevice currentDevice] userInterfaceIdiom];
¿Hay otras formas además de verificar la existencia de @ "iPad" para una aplicación universal?
- Compruebe la presencia de la propiedad userInterfaceIdiom, usings respondsToSelector :. Si no existe, estamos en un dispositivo pre-3.2, por lo tanto no es un iPad.
- Si userInterfaceIdiom existe, úselo.
Editar: ... que obviamente es exactamente lo que hace la macro UI_USER_INTERFACE_IDIOM (), entonces úsala en su lugar. :)
Puede verificar si ejecuta la aplicación en iPhone o iPad utilizando el siguiente código:
- (NSString *)deviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
- (NSString *) platformString
{
NSString *platform = [self deviceModel];
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G";
else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G";
else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS";
else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4";
else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4";
else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S";
else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPod1,1"]) return @"iPod_Touch 1G";
else if ([platform isEqualToString:@"iPod2,1"]) return @"iPod_Touch 2G";
else if ([platform isEqualToString:@"iPod3,1"]) return @"iPod_Touch 3G";
else if ([platform isEqualToString:@"iPod4,1"]) return @"iPod_Touch 4G";
else if ([platform isEqualToString:@"iPad1,1"]) return @"iPad_1G";
else if ([platform isEqualToString:@"iPad2,1"]) return @"iPad_2(WiFi)";
else if ([platform isEqualToString:@"iPad2,2"]) return @"iPad_2(GSM)";
else if ([platform isEqualToString:@"iPad2,3"]) return @"iPad_2(CDMA)";
else if ([platform isEqualToString:@"iPad3,1"]) return @"iPad_3";
else if ([platform isEqualToString:@"iPad3,2"]) return @"iPad_3(GSM/CDMA)";
else if ([platform isEqualToString:@"iPad3,3"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad3,4"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad2,5"]) return @"iPad_mini_1G";
else if ([platform isEqualToString:@"i386"]) return @"Simulator";
else if ([platform isEqualToString:@"x86_64"]) return @"Simulator";
return platform;
}
Solo para mi referencia:
@property (nonatomic, readonly) BOOL isPhone;
-(BOOL)isPhone {
return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}
o use un #define
#define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
Sin embargo, si usa isPhone
todo su código, generalmente es una mala práctica. Use el patrón de fábrica y el polimorfismo para mantener sus declaraciones if
, de modo que obtenga objetos creados para teléfono o iPad y luego trabaje con ellos.
Adicional
Estoy usando esta solución en todo mi código ahora. Agrega un patrón de fábrica estándar en el alloc.
#define ALLOC_PER_DEVICE() id retVal = nil; /
NSString *className = NSStringFromClass(self);/
if (IS_PHONE && ![className hasSuffix:@"Phone"]) {/
className = [NSString stringWithFormat:@"%@Phone", className];/
Class newClass = NSClassFromString(className);/
retVal = [newClass alloc];/
}/
if (!retVal)/
retVal = [super alloc];/
assert(retVal != nil);/
return retVal/
Entonces mis allocs se ven así:
+alloc { ALLOC_PER_DEVICE(); }
Y añado una subclase llamada TheClassPhone
para la versión del teléfono.
Nota: Dado que no hay herencia múltiple en Objective-C, el uso de la herencia para resolver sus problemas está un poco sobrevalorado (es decir, no funciona si tiene subclases de subclases). Nada como un bien if
lo necesitas.
Use NSClassFromString y una clase específica de iPad. Leer más aquí:
Devuelve la interfaz idiomática admitida por el dispositivo actual.
Valor de retorno
UIUserInterfaceIdiomPhone
si el dispositivo es un iPhone o iPod touch oUIUserInterfaceIdiomPad
si el dispositivo es un iPad.El tipo de interfaz que se debe usar en el dispositivo actual
typedef enum {
UIUserInterfaceIdiomPhone,
UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;