2010-07-14 8 views
10

Mi aplicación para iPhone (http://hexalex.com) no es universal pero tiene una función que me gustaría habilitar para las personas que juegan en iPads. ¿Hay alguna manera de detectar que estás ejecutando en un iPad en modo compatibilidad? Los métodos de UIDevice para detectar especificaciones de máquina devuelven todos los valores que obtendría en un iPhone (al menos en el simulador). Lo único que se me ocurre es detectar OS 3.2, pero esa técnica no funcionará por mucho tiempo.detección de la aplicación para iPhone que se ejecuta en iPad en modo compatibilidad

+3

¿Qué quiere decir con el modo "compatibilidad"? Esto es iOS, no Windows XP. –

+0

Cuando ejecuta una aplicación de iPhone no universal en un iPad, se ejecuta en un entorno de iPhone emulado. Tendrás que disculparme por no saber el término exacto para ello. – n8gray

+0

Sí. Las aplicaciones de iPhone se ejecutan en el iPad. En ese caso, ya sabes que construiste una aplicación para iPhone, solo tienes que comprobar si estás ejecutando en el iPad, ver mi respuesta. –

Respuesta

19

Originalmente contestado aquí: https://stackoverflow.com/a/14864400/577237

Republicado ya que es muy corta:

Si la aplicación es una aplicación de iPhone que se ejecuta en el modo emulador en un iPad, que tendrá un userInterfaceIdiom de teléfono, pero un tipo de modelo de iPad. Puede verificar esto con el siguiente código:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && 
    [[[UIDevice currentDevice] model] hasPrefix:@"iPad"]) { 
    // This app is an iPhone app running on an iPad 
} 
+0

su código es incorrecto. UI_USER_INTERFACE_IDIOM() será igual a iPad para la aplicación iPhone que se ejecuta en iPad. – SpaceDog

+0

@RubberDuck No estoy de acuerdo con su evaluación. Creé una aplicación de prueba para probar esta funcionalidad: https://github.com/michaelpatzer/TestEmulationMode –

+0

esto es extraño porque en tu aplicación el comportamiento es el esperado, pero en dos aplicaciones mías, veo el iPad como el ¡idioma! WTF !!!! – SpaceDog

9

1) Use UIDevice-Extension escrito por Erica Sadun. Una clase muy amplia: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m

2) O también se podría utilizar el método UIDevice clase:

[[UIDevice currentDevice] name]    // eg. "Brock's iPhone" 
[[UIDevice currentDevice] model]    // eg. @"iPhone", @"iPod Touch" 
[[UIDevice currentDevice] localizedModel] // localized version of model 
[[UIDevice currentDevice] systemName]  // eg. @"iPhone OS" 
[[UIDevice currentDevice] systemVersion]  // eg. @"3.2" 
[[UIDevice currentDevice] uniqueIdentifier] // UDID, a unique string to identify the device 

Cada una de las líneas de arriba, devolverá un NSString. A lo que se puede hacer una comparación de cadenas de este modo:

NSString *model = [[UIDevice currentDevice] model]; 
NSLog(@"Current device model: \"%@\"", model); 

3) Otra forma:

http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ Usted tendrá que modificar esto para utilizar el número de hardware adecuado para el IPAD. Tomado del foro:

UIDevice-hardware.h

#import 

#define IPHONE_1G_NAMESTRING @"iPhone 1G" 
#define IPHONE_3G_NAMESTRING @"iPhone 3G" 
#define IPHONE_3GS_NAMESTRING @"iPhone 3GS" 
#define IPOD_1G_NAMESTRING @"iPod touch 1G" 
#define IPOD_2G_NAMESTRING @"iPod touch 2G" 

@interface UIDevice (Hardware) 
- (NSString *) platform; 
- (NSString *) platformString; 
@end 

UIDevice-hardware.m

#import "UIDevice-hardware.h" 
#include <sys/types.h> 
#include <sys/sysctl.h> 

@implementation UIDevice (Hardware) 

/* 
Platforms 
iPhone1,1 = iPhone 1G 
iPhone1,2 = iPhone 3G 
iPhone2,1 = iPhone 3GS 
iPod1,1 = iPod touch 1G 
iPod2,1 = iPod touch 2G 
*/ 

- (NSString *) platform 
{ 
size_t size; 
sysctlbyname("hw.machine", NULL, &amp;size, NULL, 0); 
char *machine = malloc(size); 
sysctlbyname("hw.machine", machine, &amp;size, NULL, 0); 
NSString *platform = [NSString stringWithCString:machine]; 
free(machine); 
return platform; 
} 

- (NSString *) platformString 
{ 
NSString *platform = [self platform]; 
if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING; 
if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING; 
if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING; 
if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING; 
if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING; 
return NULL; 
} 
@end 
+0

No tengo un iPad para probar, pero en el simulador de iPad' [[UIDevice currentDevice] model] 'devuelve' iPhone Simulator', no 'iPad Simulator'. Supongo que devolverá 'iPhone' en lugar de' iPad' cuando se ejecute en el dispositivo. Es un entorno de iPhone emulado, así que esto no es una sorpresa. El 'hw.machine' sysctl es una sugerencia interesante, pero en el simulador de iPad simplemente devuelve' i386'. ¿Sabes lo que devuelve en el iPad cuando ejecutas una aplicación de iPhone no universal? – n8gray

+1

No debería necesitar probar esto en el simulador. Necesitas un dispositivo real; de lo contrario, ¿cómo vas a saber qué sucede en el entorno de campo? –

3

¿verificó la "UIDevice.h"? Tiene propiedad de modelo que puede encontrar en los dispositivos iPhone, iPod, iPad

NSString * name; // p. Ej. "Mi iPhone"

NSString * modelo; // p. Ej. @ "iPhone", @ "iPod Touch"

NSString * localizedModel; // versión localizada del modelo

NSString * systemName; // p. Ej. @ "iPhone OS"

NSString * systemVersion; // p. Ej. @ "2.0"

NSString * uniqueIdentifier; (DEPRECATED) // una cadena única para cada dispositivo basada en diversa información de hardware.

+0

No tengo un iPad para probar, pero en el simulador de iPad '[[UIDevice currentDevice] model]' devuelve 'iPhone Simulator', no' iPad Simulator'. – n8gray

+0

Imprimo el [[UIDevice currentDevice] modelo] y me devolvió "iPad" :) –

+0

@ n8gray: sí el simulador es limitado. solo funciona en dispositivos iOS. –

Cuestiones relacionadas