2014-10-31 15 views
5

Tôi có mã theo dõi để phát hiện Thiết bị iOS.Kiểm tra loại và phiên bản iOS Simulator

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

Tôi cũng mong muốn có danh sách Trình mô phỏng iOS là gì?

Xem hình ảnh sau đây.

LIST OF IOS SIMULATORS

Nói tóm lại, tôi cũng muốn có phát hiện loại mô phỏng với những gì phiên bản iOS đang được sử dụng thời gian chạy như chúng tôi phát hiện các thiết bị.

Đây là khối mã cho biết nỗ lực của tôi giống nhau.

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

Là nhà phát triển, bạn không cần thực hiện bất kỳ quyết định nào dựa trên thông tin đó. Vui lòng giải thích lý do bạn cần thông tin này và tôi sẽ giúp bạn tìm ra giải pháp thay thế tốt hơn. –

+1

Vâng. Tôi không thể có tất cả các thiết bị cùng một lúc như iPhone6, iPhone6 ​​+, iPad Air2, iPadAir, iPadMini3 vv Đôi khi, chúng tôi đã tích hợp mã thiết bị cụ thể. Nhưng nó trở nên khó khăn để kiểm tra những mã cụ thể trên mô phỏng. –

+0

Quan điểm của tôi là bạn không cần phải biết những số nhận dạng này. Bạn không nên đưa ra bất kỳ quyết định nào trong ứng dụng của mình dựa trên các số nhận dạng này. Bạn nên đưa ra quyết định dựa trên các tiêu chí KHÁC, chứ không phải định danh phần cứng. –

Trả lời

6

Như đã nêu trong nhận xét của tôi ở trên, bạn thực sự không cần thông tin này.

Nhưng vì ít nhất là cung cấp câu trả lời, với Xcode 6, bạn có thể sử dụng getenv("SIMULATOR_MODEL_IDENTIFIER") thay vì sysctlbyname("hw.machine", ...). Không có gì đảm bảo rằng điều này sẽ hoạt động trong các bản phát hành trong tương lai.

+0

Thông tin này hữu ích khi thiết lập NSLayoutConstraints tùy chỉnh dựa trên thiết bị. Bạn có thể bao gồm đoạn mã để nhận được NSString đầy đủ của loại Mô phỏng đang chạy không? – TheJeff

+0

Xcode 8 Phân tích sẽ báo cáo rò rỉ bộ nhớ trên "máy" nếu bạn thay thế dòng "getenv" cho dòng "sysctlbyname" thứ hai, ngay cả với dòng "miễn phí (máy)". Điều đó có thể được giải quyết bằng cách giữ dòng thứ hai "sysctlbyname" và đặt dòng "getenv" ngay sau đó. Nhưng, đủ kỳ quặc, bạn phải loại bỏ dòng "miễn phí (máy)". Không có rò rỉ bộ nhớ được báo cáo, không có vấn đề deallocating các biến. – GlennRay

+0

Chỉ cần được rõ ràng, tôi nhận được một lỗi biên dịch nếu tôi để lại trong "miễn phí (máy)" dòng nói rằng biến không thể được giải phóng bởi vì nó chưa bao giờ được phân bổ. Tuy nhiên, tôi đặt giá trị của các biến tôi sử dụng (bao gồm "máy") thành nil ở cuối mô-đun. – GlennRay

Các vấn đề liên quan