2014-10-31 8 views
5

Ich habe folgende Code-Schnipsel, um das iOS-Gerät zu erkennen.Überprüfen iOS Simulator Typ und Version

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

NSString * platformString() { 
    NSString *platform = platformNSString(); 

    // iphones 
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; 
    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; 
    if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; 
    if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; 
    if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; 
    if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (CDMA)"; 
    if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; 
    if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; 
    if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (UK+Europe+Asis+China)"; 
    if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (UK+Europe+Asis+China)"; 
    if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6"; 
    if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6 Plus"; 

    // ipods 
    if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch (1 Gen)"; 
    if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch (2 Gen)"; 
    if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch (3 Gen)"; 
    if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch (4 Gen)"; 
    if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch (5 Gen)"; 

    // ipads 
    if ([platform isEqualToString:@"iPad1,1"]) return @"iPad"; 
    if ([platform isEqualToString:@"iPad1,2"]) return @"iPad 3G"; 
    if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)"; 
    if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2"; 
    if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; 
    if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2"; 
    if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)"; 
    if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini"; 
    if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)"; 
    if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3"; 
    if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)"; 
    if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4"; 
    if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)"; 
    if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini Retina (WiFi)"; 
    if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini Retina (GSM+CDMA)"; 
    if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini Retina (GSM+CDMA)"; 
    // iPad5,3 

    // simulators 
    if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"] || [platform isEqualToString:@"ppc"] || [platform isEqualToString:@"ppc64"]) { 

    } 

    else return @"Unknown"; 
    return platform; 
} 

Was erwarte ich auch, eine Liste von iOS Simulatoren zu haben?

Siehe folgendes Bild.

LIST OF IOS SIMULATORS

Kurz gesagt, möchte ich auch mit, welche Art von Simulator erkennen, was iOS-Version der Laufzeit benutzt wird, wie wir das Gerät erkennen.

Hier ist der Code-Block, der meine Bemühungen auf derselben zeigt.

// simulators 
if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"] || [platform isEqualToString:@"ppc"] || [platform isEqualToString:@"ppc64"]) { 
    CGSize size = [[UIScreen mainScreen] bounds].size; 
    CGFloat simulatorHeight = (size.height>size.width)?size.height:size.width; 
    if(simulatorHeight>=2048) { 
     return @"Retina iPad Simulator"; 
    } else if(simulatorHeight>=1920) { 
     return @"Retina iPhone 6+ Simulator"; 
    } else if(simulatorHeight>=1334) { 
     return @"Retina iPhone 6 Simulator"; 
    } else if(simulatorHeight>=1136) { 
     return @"Retina iPhone 5/5S/5C Simulator"; 
    } else if(simulatorHeight>=960) { 
     return @"Retina iPhone 4/4S Simulator"; 
    } else if(simulatorHeight>=480) { 
     return @"Retina iPhone 4/4S Simulator"; 
    } 
} 
+0

Als Entwickler sollten Sie basierend auf diesen Informationen keine Entscheidung treffen müssen. Bitte erläutern Sie, warum Sie diese Informationen benötigen und ich werde Ihnen helfen, eine bessere Alternative zu finden. –

+1

Gut. Ich kann nicht alle Geräte auf einmal haben wie iPhone6, iPhone6 ​​+, iPad Air2, iPadAir, iPadMini3 usw. Manchmal haben wir gerätespezifischen Code integriert. Aber es fällt schwer, diesen spezifischen Code auf Simulatoren zu überprüfen. –

+0

Mein Punkt ist, dass Sie diese Kennungen nicht brauchen sollten. Sie sollten in Ihrer Anwendung keine Entscheidungen aufgrund dieser Kennungen treffen. Sie sollten Entscheidungen basierend auf anderen Kriterien treffen, nicht die Hardware-Kennung. –

Antwort

6

Wie in meinem Kommentar oben erwähnt, sollten Sie diese Informationen wirklich nicht benötigen.

Aber um mindestens eine Antwort zu geben, können Sie mit Xcode 6 getenv("SIMULATOR_MODEL_IDENTIFIER") statt sysctlbyname("hw.machine", ...) verwenden. Es gibt keine Garantie, dass dies in zukünftigen Versionen funktioniert.

+0

Diese Informationen sind hilfreich, wenn Sie benutzerdefinierte NSLayoutConstraints basierend auf dem Gerät festlegen. Könnten Sie ein Code-Snippet einfügen, um den vollständigen NSString des Typs des ausgeführten Simulators zu erhalten? – TheJeff

+0

Xcode 8 Analysis wird ein Speicherleck auf "Maschine" melden, wenn Sie die "getenv" -Zeile für die zweite "sysctlbyname" -Zeile ersetzen, sogar mit der "free (machine)" -Zeile. Dies kann gelöst werden, indem diese zweite "sysctlbyname" -Linie beibehalten wird und die "getenv" -Zeile unmittelbar danach eingefügt wird. Aber merkwürdigerweise müssen Sie die "freie (Maschine)" -Linie loswerden. Kein Speicherleck gemeldet, kein Problem beim Freigeben der Variablen. – GlennRay

+0

Nur um klar zu sein, bekomme ich einen Kompilierfehler, wenn ich in der Zeile "free (machine)" lasse, dass die Variable nicht freigegeben werden kann, weil sie nie zugewiesen wurde. Ich setze jedoch die Werte der Variablen, die ich verwende (einschließlich "Maschine"), am Ende des Moduls auf Null. – GlennRay

Verwandte Themen