API para determinar si se ejecuta en iPhone o iPad

¿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?

UI_USER_INTERFACE_IDIOM .

Devuelve la interfaz idiomática admitida por el dispositivo actual.

Valor de retorno
UIUserInterfaceIdiomPhone si el dispositivo es un iPhone o iPod touch o UIUserInterfaceIdiomPad si el dispositivo es un iPad.

UIUserInterfaceIdiom

El tipo de interfaz que se debe usar en el dispositivo actual

 typedef enum { UIUserInterfaceIdiomPhone, UIUserInterfaceIdiomPad, } UIUserInterfaceIdiom; 

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 polymorphism 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.

  1. 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.
  2. 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; }