API para determinar se está sendo executado no iPhone ou no iPad

Existe uma API para verificar em tempo de execução se você está executando em um iPhone ou um iPad?

Uma maneira que posso pensar seria usar:

[[UIDevice currentDevice] model]; 

E detectar a existência da string @ “iPad” – o que parece um pouco frágil.

No SDK 3.2, vejo que o UIDevice também tem uma propriedade que é realmente o que estou procurando, mas não funciona para o pré-3.2 (obviamente):

 [[UIDevice currentDevice] userInterfaceIdiom]; 

Existem outras maneiras de verificar a existência de @ “iPad” para um aplicativo universal?

Checkout UI_USER_INTERFACE_IDIOM .

Retorna o idioma da interface suportado pelo dispositivo atual.

Valor de retorno
UIUserInterfaceIdiomPhone se o dispositivo for um iPhone ou iPod touch ou UIUserInterfaceIdiomPad se o dispositivo for um iPad.

UIUserInterfaceIdiom

O tipo de interface que deve ser usado no dispositivo atual

 typedef enum { UIUserInterfaceIdiomPhone, UIUserInterfaceIdiomPad, } UIUserInterfaceIdiom; 

Apenas para minha referência:

 @property (nonatomic, readonly) BOOL isPhone; -(BOOL)isPhone { return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone); } 

ou use um #define

 #define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) 

No entanto, se você estiver usando o isPhone todo o seu código, isso geralmente é uma prática ruim. Use o padrão de fábrica e polymorphism para manter suas instruções if contidas, para que você obtenha objects criados para telefone ou para iPad e, em seguida, trabalhe com eles.

Adicionado

Estou usando essa solução em todo o meu código agora. Adiciona um padrão de fábrica padrão na alocação.

 #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\ 

Então minhas alocações são assim:

 +alloc { ALLOC_PER_DEVICE(); } 

E eu adiciono uma subclass chamada TheClassPhone para a versão do telefone.

Nota: Como não há inheritance múltipla em Objective-C, usar inheritance para resolver seus problemas é um pouco superestimado (isto é, não funciona se você tiver subclasss de subclasss). Nada como um bom if quando você precisar.

  1. Verifique a presença da propriedade userInterfaceIdiom, usings respondsToSelector :. Se não existir, estamos em um dispositivo pré-3.2, portanto, não em um iPad.
  2. Se userInterfaceIdiom existir, use-o.

Edit: … que é obviamente exatamente o que faz a macro UI_USER_INTERFACE_IDIOM (), então use isso. 🙂

Você pode verificar se você executa o aplicativo no iPhone ou iPad usando o seguinte 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; }