ver realidad puedo para moviles funciona datos consumo como cerrar aumentada apps aplicaciones activar iphone objective-c cocoa-touch ipad uidevice

realidad - API para determinar si se ejecuta en iPhone o iPad



itunes (5)

Esta pregunta ya tiene una respuesta aquí:

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


  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; }


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.



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;