2010-07-14 6 views
10

La mia app per iPhone (http://hexalex.com) non è universale ma ha una funzione che vorrei abilitare per le persone che giocano su iPad. C'è un modo per rilevare che stai correndo su un iPad in modalità compatibilità? I metodi UIDevice per il rilevamento delle specifiche della macchina restituiscono tutti i valori che si otterrebbero su un iPhone (almeno sul simulatore). L'unica cosa che posso pensare è rilevare il SO 3.2, ma quella tecnica non funzionerà a lungo.rilevamento di un'app per iPhone in esecuzione su iPad in modalità compatibilità

+3

Che cosa si intende per modalità "compatibilità"? Questo è iOS, non Windows XP. –

+0

Quando si esegue un'app per iPhone non universale su un iPad, viene eseguito in un ambiente emulato per iPhone. Dovrai scusarmi per non aver saputo il termine esatto per questo. – n8gray

+0

Sì. Le app per iPhone funzionano su iPad. In quel caso sai già che hai costruito un'app per iPhone, devi solo verificare se stai navigando su iPad, vedere la mia risposta. –

risposta

19

Originariamente risposto qui: https://stackoverflow.com/a/14864400/577237

Ripubblicato dal momento che è così breve:

Se l'applicazione è un'applicazione per iPhone in esecuzione in modalità emulatore su un iPad, avrà un userInterfaceIdiom di telefono, ma un modello di iPad. È possibile controllare questo con il seguente codice:

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

il tuo codice non è corretto. UI_USER_INTERFACE_IDIOM() sarà uguale a ipad per l'app per iPhone in esecuzione su iPad. – SpaceDog

+0

@RubberDuck Devo essere in disaccordo con la vostra valutazione. Ho creato un'applicazione di test per testare questa funzionalità: https://github.com/michaelpatzer/TestEmulationMode –

+0

questo è strano perché nella tua app il comportamento è quello previsto ma in due app mie, vedo iPad come idioma! WTF !!!! – SpaceDog

9

1) Usa UIDevice-Extension scritto da Erica Sadun. Una classe molto completo: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m

2) Oppure si potrebbe anche utilizzare il metodo di UIDevice classe:

[[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 

Ciascuna delle linee di cui sopra restituirà un NSString. Per cui si può fare un confronto tra stringhe in questo modo:

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

3) Un altro modo:

http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ Sarà necessario modificare questo di utilizzare il numero giusto hardware per l'iPad. Preso dal link qui sopra:

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

Non ho un iPad da testare, ma nel simulatore iPad' [[UIDevice currentDevice] model] 'restituisce' iPhone Simulator', non 'iPad Simulator'. Presumo che restituirà 'iPhone' invece di' iPad' quando è in esecuzione sul dispositivo. È un ambiente emulato per iPhone, quindi non è una sorpresa. La sysctl 'hw.machine' è un suggerimento interessante, ma sul simulatore iPad restituisce semplicemente' i386'. Sai cosa restituisce sull'iPad quando si esegue un'app per iPhone non universale? – n8gray

+1

Non è necessario verificare questo sul simulatore. Hai bisogno di un dispositivo reale, altrimenti come fai a sapere che cosa succede nell'ambiente di campo? –

3

Hai controllato la "UIDevice.h"? Ha una proprietà di modello che puoi trovare su iPhone, iPod, dispositivi iPad

NSString * nome; // ad es. "My iPhone"

NSString * modello; // ad es. @ "iPhone", @ "iPod Touch"

NSString * localizedModel; // versione localizzata del modello

NSString * systemName; // ad es. @ "Sistema operativo iPhone"

NSString * systemVersion; // ad es. @ "2.0"

NSString * uniqueIdentifier; (DEPRECATED) // a stringa univoca per ogni dispositivo basata su varie informazioni sull'hardware.

+0

Non ho un iPad da testare, ma nel simulatore iPad '[[UIDevice currentDevice] model]' restituisce 'iPhone Simulator', non' iPad Simulator'. – n8gray

+0

Stampo [[UIDevice currentDevice] model] e mi ha restituito "iPad" :) –

+0

@ n8gray: sì il simulatore è limitato. funziona solo su dispositivi iOS. –

Problemi correlati