API per determinare se eseguire su iPhone o iPad

Esiste un’API per il controllo in fase di esecuzione, sia che tu stia utilizzando un iPhone o un iPad?

Un modo in cui posso pensare sarebbe di usare:

[[UIDevice currentDevice] model]; 

E rileva l’esistenza della stringa @ “iPad” – che sembra un po ‘fragile.

UIDevice 3.2, vedo che UIDevice ha anche una proprietà che è davvero ciò che sto cercando, ma non funziona per la pre-3.2 (ovviamente):

 [[UIDevice currentDevice] userInterfaceIdiom]; 

Esistono altri modi oltre a verificare l’esistenza di @ “iPad” per un’app universale?

Checkout UI_USER_INTERFACE_IDIOM .

Restituisce l’idioma dell’interfaccia supportato dal dispositivo corrente.

Valore di ritorno
UIUserInterfaceIdiomPhone se il dispositivo è un iPhone o iPod touch o UIUserInterfaceIdiomPad se il dispositivo è un iPad.

UIUserInterfaceIdiom

Il tipo di interfaccia che dovrebbe essere utilizzata sul dispositivo corrente

 typedef enum { UIUserInterfaceIdiomPhone, UIUserInterfaceIdiomPad, } UIUserInterfaceIdiom; 

Solo per il mio riferimento:

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

o usa un #define

 #define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) 

Tuttavia, se stai usando isPhone su tutto il tuo codice, è generalmente una ctriggers pratica. Usa lo schema di fabbrica e il polimorfismo per mantenere le tue istruzioni if , in modo da ottenere oggetti creati per telefono o per iPad e quindi lavorare con quelli.

aggiunto

Sto usando questa soluzione su tutto il mio codice ora. Aggiunge un modello di fabbrica standard nell’assegnazione.

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

Quindi i miei allocs assomigliano a questo:

 +alloc { ALLOC_PER_DEVICE(); } 

E aggiungo una sottoclass chiamata TheClassPhone per la versione del telefono.

Nota: poiché non esiste un’ereditarietà multipla in Objective-C, l’utilizzo dell’ereditarietà per risolvere i problemi è un po ‘sopravvalutato (cioè, non funziona se si hanno sottoclassi di sottoclassi). Niente di buono if quando ne hai bisogno.

  1. Verificare la presenza della proprietà userInterfaceIdiom, gli utilizzi rispondono aSelettore :. Se non esiste, siamo su un dispositivo pre-3.2, quindi non su un iPad.
  2. Se userInterfaceIdiom esiste, usarlo.

Modifica: … che è ovviamente esattamente ciò che fa la macro UI_USER_INTERFACE_IDIOM (), quindi usa quello. 🙂

Puoi verificare se esegui l’app su iPhone o iPad usando il seguente codice:

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