2013-01-19 12 views

risposta

39

Le possibili valli sono iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

Se volete sapere quale hardware iOS sta rovinando avanti così iPhone3, iPhone4, iPhone5 ecc sotto è il codice per quella


NOTA: Il seguente codice potrebbe non contenere tutti devi stringa di ce, sto con gli altri ragazzi stanno mantenendo lo stesso codice su GitHub quindi si prega di prendere l'ultimo codice da lì

Objective-C: GitHub/DeviceUtil

Swift: GitHub/DeviceGuru


#include <sys/types.h> 
#include <sys/sysctl.h> 

- (NSString*)hardwareDescription { 
    NSString *hardware = [self hardwareString]; 
    if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; 
    if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; 
    if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; 
    if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; 
    if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; 
    if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G"; 
    if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G"; 
    if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad"; 
    if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini"; 
    if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI"; 
    //there are lots of other strings too, checkout the github repo 
    //link is given at the top of this answer 

    if ([hardware isEqualToString:@"i386"]) return @"Simulator"; 
    if ([hardware isEqualToString:@"x86_64"]) return @"Simulator"; 

    return nil; 
} 

- (NSString*)hardwareString { 
    size_t size = 100; 
    char *hw_machine = malloc(size); 
    int name[] = {CTL_HW,HW_MACHINE}; 
    sysctl(name, 2, hw_machine, &size, NULL, 0); 
    NSString *hardware = [NSString stringWithUTF8String:hw_machine]; 
    free(hw_machine); 
    return hardware; 
} 
+11

Sono curioso perché è stato accettato. Non risponde affatto alla domanda. – rmaddy

+0

Mi sembra come se fosse, ma in modo indiretto. – tomasmcguinness

+0

@Inder Kumar Rathore, in iOS 6.1 questa funzione non funziona perfettamente. In 1 caso da 3, quindi è possibile restituire un altro valore – CReaTuS

21

Ho appena effettuato un test su iPod Touch, iPhone, Retina telefono, iPhone 5, iPad, Retina iPad e Mini iPad. Quindi questa è la mia conclusione:

iPod touch 
iPhone 
iPad 

su simulatori - questo potrebbe essere utile se sei uno sviluppatore che lavora sulle caratteristiche che a volte non funzionano affatto su simulatori - si otterrà questi valori:

iPhone Simulator 
iPad Simulator 
+3

Hai dimenticato i simulatori ... – andreas

+0

Ah, la risposta effettiva alla domanda postata! Grazie. Mi chiedevo specificamente se l'iPad Mini sarebbe stato indicato e non ne avesse uno a portata di mano (e non è supportato nel simulatore XCode), e questo ha risposto. – BobDickinson

+0

Qualcuno conosce i valori di AppleTV? – ColdLogic

0

Credo che la migliore risposta da spiegare (qualcosa che non è stato scritto qui) È dire che il valore stesso è un valore di stringa. e le possibili risposte sono stringhe ad esempio: "iPhone", "iPad" ed ecc.

0

Nessuna di queste risposte è estendibile per i nuovi numeri di modello. Qui è un'enumerazione:

public enum DeviceType { 
case iPad(String?) 
case iPhone(String?) 
case simulator(String?) 
case appleTV(String?) 
case unknown 
} 

e l'estensione ho scritto che secondo me è un po 'più pulito e un po' più estensibile per quando il numero nuovo modello di venire fuori.

extension UIDevice { 
    public static func getDevice() -> DeviceType { 
     var info = utsname() 
     uname(&info) 
     let machineMirror = Mirror(reflecting: info.machine) 
     let code = machineMirror.children.reduce("") { identifier, element in 
      guard let value = element.value as? Int8, value != 0 else { 
       return identifier 
      } 
      return identifier + String(UnicodeScalar(UInt8(value))) 
     } 

     if code.lowercased().range(of: "ipad") != nil { 
      if let range = code.lowercased().range(of: "ipad") { 
       var mutate = code 
       mutate.removeSubrange(range) 
       return .iPad(mutate) 
      }else{ 
       return .iPad(nil) 
      } 
     }else if code.lowercased().range(of: "iphone") != nil { 
      if let range = code.lowercased().range(of: "iphone") { 
       var mutate = code 
       mutate.removeSubrange(range) 
       return .iPhone(mutate) 
      }else{ 
       return .iPhone(nil) 
      } 
     }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{ 
      return .simulator(code) 
     }else if code.lowercased().range(of: "appletv") != nil { 
      if let range = code.lowercased().range(of: "appletv") { 
       var mutate = code 
       mutate.removeSubrange(range) 
       return .appleTV(mutate) 
      }else{ 
       return .appleTV(nil) 
      } 
     }else{ 
      return .unknown 
     } 
    } 
} 
Problemi correlati