2013-01-19 11 views

cevap

39

olası valflann iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

Eğer iPhone3 gibi üzerinde mahvediyor hangi donanım iOS bilmek istiyorsanız, iPhone4, iPhone5 vb aşağıda o

kodudur vardır

NOT: Aşağıdaki kod tüm sapmaları içermeyebilir 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; 
} 
CE'nin dize, başka adamlar çok

Objective-C oradan son kod atın GitHub'dan aynı kodu muhafaza edilir beraberim

+11

Bunun neden kabul edildiğini merak ediyorum. Bu soruya hiç cevap vermiyor. – rmaddy

+0

Bana öyle görünüyor, ama dolambaçlı bir şekilde. – tomasmcguinness

+0

@Inder Kumar Rathore, iOS 6.1'de bu func tam olarak çalışmıyor. 3 durumda 1, sonra başka bir değer dönebilir – CReaTuS

21

Sadece iPod Touch, iPhone, Telefon Retina, iPhone 5, iPad, iPad Retina ve iPad Mini'de bir test yaptım.

iPhone Simulator 
iPad Simulator 
: - bazen simülatörleri üzerinde hiç çalışmıyor özelliklere çalışan bir geliştirici iseniz bu yararlı olabilir - Eğer bu değerler alırsınız

similatörlerinde
iPod touch 
iPhone 
iPad 

: Yani bu benim sonuç olduğunu

+3

Simülatörleri unuttun ... – andreas

+0

Ah, yayınlanan soruya gerçek cevap! Teşekkürler. Özellikle iPad Mini'nin gösterilip gösterilmeyeceğini ve bir tane kullanışlı olmadığını (ve XCode simülatöründe desteklenmediğini) merak ettim ve bunu yanıtladı. – BobDickinson

+0

AppleTV değerlerini bilen var mı? – ColdLogic

0

Açıklamak için en iyi cevaba inanıyorum (burada yazılmayan bir şey) Değerin kendisinin bir String değeri olduğunu söylemek gerekir. ve olası cevaplar, örneğin: "iPhone", "iPad" ve benzerleridir.

0

Bu cevapların hiçbiri yeni model numaraları için genişletilemez. İşte bir numaralandırma geçerli:

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

Ve Uzatma ben biraz daha temiz ve yeni model numarası çıkması için biraz daha uzatılabilir olduğunu düşünüyorum yazdı.

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