2010-07-14 20 views
10

Meine iPhone-App (http://hexalex.com) ist nicht universell, aber sie verfügt über eine Funktion, die ich für Nutzer aktivieren möchte, die auf iPads spielen. Gibt es eine Möglichkeit zu erkennen, dass Sie auf einem iPad im Kompatibilitätsmodus laufen? Die UIDevice-Methoden zum Erkennen von Maschinenspezifikationen geben alle die Werte zurück, die Sie auf einem iPhone erhalten würden (zumindest auf dem Simulator). Das einzige, was mir einfällt, ist das Erkennen von OS 3.2, aber diese Technik wird nicht lange funktionieren.Ermitteln der iPhone-App auf dem iPad im Kompatibilitätsmodus

+3

Was meinen Sie mit "Kompatibilität" Modus? Dies ist iOS, nicht Windows XP. –

+0

Wenn Sie eine nicht universelle iPhone-App auf einem iPad ausführen, wird sie in einer emulierten iPhone-Umgebung ausgeführt. Sie müssen mich dafür entschuldigen, dass ich den genauen Begriff dafür nicht kenne. – n8gray

+0

Ja. iPhone Apps laufen auf dem iPad. In diesem Fall wissen Sie bereits, dass Sie eine iPhone-App erstellt haben, Sie müssen nur überprüfen, ob Ihr auf dem iPad läuft, siehe meine Antwort. –

Antwort

19

beantwortet Ursprünglich hier: https://stackoverflow.com/a/14864400/577237

Reposted, da es so kurz ist:

Wenn die App ein iPhone App ist im Emulator-Modus auf einem iPad läuft, wird es eine userInterfaceIdiom von Telefon, aber ein Modelltyp von iPad. Sie können dies mit dem folgenden Code überprüfen:

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

Ihr Code ist falsch. UI_USER_INTERFACE_IDIOM() ist identisch mit ipad für iPhone App auf dem iPad. – SpaceDog

+0

@RubberDuck Ich muss Ihrer Einschätzung nicht zustimmen. Ich habe eine Test-App erstellt, um diese Funktionalität zu testen: https://github.com/michaelpatzer/TestEmulationMode –

+0

das ist seltsam, weil auf Ihrer App das Verhalten erwartet wird, aber in zwei Apps von mir sehe ich iPad als die Idiom! WTF !!!! – SpaceDog

9

1) Verwenden Sie UIDevice-Erweiterung geschrieben von Erica Sadun. Eine sehr umfangreiche Klasse: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m

2) Oder Sie könnten auch die Methode UIDevice Klasse verwenden:

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

Jede der oben genannten Linien wird eine NSString zurück. Welchem ​​können Sie ein String-Vergleich wie so tun:

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

3) Ein anderer Weg:

http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ Sie müssen dies ändern, um die richtige Hardware-Nummer für das iPad zu verwenden. Entnommen aus den obigen Link:

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

Ich habe kein iPad zum Testen, aber im iPad Simulator' [[UIDevice currentDevice] Modell] 'gibt' iPhone Simulator' zurück, nicht 'iPad Simulator'. Ich nehme an, dass es "iPhone" anstelle von "iPad" zurückgibt, wenn es auf dem Gerät läuft. Es ist eine emulierte iPhone-Umgebung, also ist das keine Überraschung. Die 'hw.machine' sysctl ist ein interessanter Vorschlag, aber auf dem iPad-Simulator gibt es nur' i386' zurück. Weißt du, was es auf dem iPad zurückgibt, wenn es eine nicht-universelle iPhone App ausführt? – n8gray

+1

Sie sollten dies nicht am Simulator testen müssen. Sie brauchen ein echtes Gerät, sonst wie können Sie wissen, was in der Feldumgebung passiert? –

3

Haben Sie den "UIDevice.h" überprüfen? Es hat Modelleigenschaft, die Sie die iPhone, iPod, iPad-Geräte finden können

NSString * Name; // z.B. "Mein iPhone"

NSString * -Modell; // z.B. @ "iPhone", @ "iPod Touch"

NSString * lokalisiertesModell; // lokalisierte Version des Modells

NSString * systemName; // z.B. @ "iPhone OS"

NSString * systemVersion; // z.B. @ "2.0"

NSString * uniqueIdentifier; (DEPRECATED) // a Zeichenfolge eindeutig für jedes Gerät basierend auf verschiedene Hardware-Informationen.

+0

Ich habe kein iPad zum Testen, aber im iPad Simulator '[[UIDevice currentDevice] Modell]' gibt 'iPhone Simulator' zurück, nicht' iPad Simulator'. – n8gray

+0

Ich drucke [[UIDevice currentDevice] Modell] und es gab mir "iPad" :) –

+0

@ n8gray: Ja Simulator ist begrenzt. funktioniert nur auf iOS-Geräten. –

Verwandte Themen