2011-03-17 56 views
6

由於我沒有iPad 2,因此在調用[[UIDevice currentDevice]型號]時需要知道它返回的內容。我認爲它只是返回「iPad」,但似乎我錯了。iPad 2檢測

有人可以告訴我嗎?

感謝

+0

作爲另一個[提問]注意(http://stackoverflow.com/questions/1403854/programmatically-identifing-the- iphone-device/1404080#1404080),這通常是錯誤的問題。 – ohmantics 2011-12-16 23:45:00

回答

13

決不使用model財產以外的任何顯示它的信息的目的或診斷輸出別人。它不保證被保留,如果你依賴它,你會不必要地切斷新設備。

許多iPhone應用程序無法在iPad兼容模式下使用,只是因爲他們檢查了model屬性,如果它不是iPhone/iPod,他們什麼也沒做。

+0

好的,那麼我如何檢測iPad 2? – Martin 2011-03-17 11:59:38

+2

不要檢測iPad 2,檢測iPad 2的功能。iPad 3和其他設備很可能也會擁有它們。 – 2011-03-17 12:02:49

+0

獲取模型對於避免檢查需要幾秒鐘的AGPS仍然很有用。例如,如果模型字符串中有一個iPhone,則您知道該設備具有AGPS。如果你得到一個未知的字符串,你仍然可以使用後備。 – Jano 2011-05-04 11:41:00

27

用照相機檢查iPad。

BOOL isIPad2 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && 
       [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]); 

請注意,檢測特定功能通常更好,而不是基於模型/版本檢測進行一攬子假設。例如,如果您需要相機,請明確測試相機;如果您需要根據可用RAM的數量調整UI質量,請參閱test for physical RAM;等等。還請注意a comment I wrote,強調使用模型檢測的危險。

+0

謝謝。我自己並沒有想到這麼遠。 :-D – 2011-05-17 19:22:30

+1

+1回答這個問題 – 2011-05-26 20:18:42

+0

這是一個很好的黑客!但基於相機的存在檢測可能會導致進一步的ipad型號的問題。但現在我仍然會使用這種黑客技術。謝謝;) – oberthelot 2011-11-02 14:59:53

0

首先,我應該提及,我花了很多時間來弄清楚爲什麼ipad模擬器「說」它是iphone。對我來說,它變成了我不得不在其切換到通用:

enter image description here

這裏是我認爲這是這個相當典型檢測的代碼。還有其他人可能也工作,但...

// lifted this from the ios 4 cookbook: 
- (BOOL) isiPad{ 

    BOOL result = NO; 

    NSString *classAsString = 
    NSStringFromClass([UISplitViewController class]); 

    if (classAsString == nil || 
     [classAsString length] == 0){ 
     return(NO); 
    } 

    UIDevice *device = [UIDevice currentDevice]; 

    if ([device respondsToSelector: 
     @selector(userInterfaceIdiom)] == NO){ 
     return(NO); 
    } 

    NSLog(@"Device: %d", [[UIDevice currentDevice] userInterfaceIdiom]); 
    NSLog(@"Device: %@", [[UIDevice currentDevice] model]); 

    if ([device userInterfaceIdiom] != UIUserInterfaceIdiomPad){ 
     return(NO); 
    } 

    // you can put some screen size tests here too if you'd like 
    result = YES; 

    return(result); 
} 
9

要獲得精確的模型字符串,例如「iPad2,2」,你可以使用這樣的東西。

#import "YourDeviceDetectionClass.h" 
#include <sys/utsname.h> 

@implementation YourDeviceDetectionClass 

+(NSString*)modelAsString 
{ 
    struct utsname platform; 
    int rc = uname(&platform); 
    if(rc == -1) 
    { 
     // Error... 
     return nil; 
    } 
    else 
    { 
     // Convert C-string to NSString 
     return [NSString stringWithCString:platform.machine encoding:NSUTF8StringEncoding]; 
    } 
} 

@end 
+1

太棒了!比任何其他解決方案都更好。 謝謝朋友! – DZenBot 2012-02-27 02:32:57

2

如果您使用的是OpenGL,則可以查看GPU模型。 iPad的1擁有的PowerVR SGX 535和iPad 2擁有的PowerVR SGX 543

const char * deviceStr = (const char *)glGetString(GL_RENDERER); 
if (!strcmp(deviceStr, "PowerVR SGX 535")) { 
    // iPad 1 
} 
else { 
    // iPad 2 or later 
} 
+1

這是真正的haxx0r方式 – 2012-03-07 19:40:43

1

UIDevice Class Reference應該有所幫助。有關更具體的解決方案,請嘗試this SO question

至於你的第二個問題,測試分辨率的最好方法是獲取類似於iPad3,1的PPI數量的顯示。不幸的是,你可能無法做到。測試任何應用程序的最佳方式是在實際設備上。

4

我想你可以測試它擴展

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    if ([[[UIScreen mainScreen] scale] == 2.0) { 
     // retina display 
    } 
} 
+0

iPad 2沒有視網膜顯示屏。另外,我認爲顯示分辨率不是檢測設備的正確方法。 – Koraktor 2012-05-22 05:17:50

7

UIScreen + Retina.h #進口

@interface UIScreen(Retina) 

// Returns YES if this is a Retina display. 
- (BOOL)isRetina; 


@end 

UIScreen +視網膜。米

#import "UIScreen+Retina.h" 

@implementation UIScreen(Retina) 

- (BOOL)isRetina { 
    return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0); 
} 

@end 

USAGE

#import "UIScreen+Retina.h" 

//http://stackoverflow.com/questions/3294100/how-to-differentiate-between-iphone4-and-iphone-3

if ([[UIScreen mainScreen] isRetina]) { 
    // Retina display 
} 

IPAD/IPHONE高/低RES

#import "UIScreen+Retina.h" 
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ 
    //IPAD   
    if ([[UIScreen mainScreen] isRetina]) { 
     // IPAD 3 - Retina display 
     bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_HIGHRES;    
    }else{ 
     //iPAD 1/2 
     bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_LOWRES;  } 
}else{ 
    //IPHONE 
    if ([[UIScreen mainScreen] isRetina]) { 
     // IPHONE 4/4s/5 - Retina display 
     bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_HIGHRES; 

    }else{ 
     //IPHONE (3.x) 
     bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_LOWRES; 

    } 
} 
1

本LI網元將打印設備版本:

Ipad的1:平臺:iPad1,1

ipad 2的:平臺:iPad2,1

ipad公司3:平臺:iPad3,3

iPhone 4S:平臺:iPhone4,1

模擬器:平臺:x86_64的

size_t size; 
sysctlbyname("hw.machine", NULL, &size, NULL, 0); 
char *answer = (char*)malloc(size); 
sysctlbyname("hw.machine", answer, &size, NULL, 0); 
NSString *platform = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; 
free(answer); 
NSLog(@"Platform: %@", platform); 
0

ÿ OU可以得到你從以下網站希望所有的iPad2收益模型或iOS設備的型號: IOS Devices Models and Platforms

您也可以使用下面的代碼來檢索模型直接:

- (NSString *)deviceModel 
{ 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; 
} 

- (NSString *) platformString 
{ 
    NSString *platform = [self deviceModel]; 
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G"; 
    else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G"; 
    else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS"; 
    else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4"; 
    else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4"; 
    else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S"; 
    else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5"; 
    else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5"; 
    else if ([platform isEqualToString:@"iPod1,1"])  return @"iPod_Touch 1G"; 
    else if ([platform isEqualToString:@"iPod2,1"])  return @"iPod_Touch 2G"; 
    else if ([platform isEqualToString:@"iPod3,1"])  return @"iPod_Touch 3G"; 
    else if ([platform isEqualToString:@"iPod4,1"])  return @"iPod_Touch 4G"; 
    else if ([platform isEqualToString:@"iPad1,1"])   return @"iPad_1G"; 
    else if ([platform isEqualToString:@"iPad2,1"])  return @"iPad_2(WiFi)"; 
    else if ([platform isEqualToString:@"iPad2,2"])  return @"iPad_2(GSM)"; 
    else if ([platform isEqualToString:@"iPad2,3"])  return @"iPad_2(CDMA)"; 
    else if ([platform isEqualToString:@"iPad3,1"])  return @"iPad_3"; 
    else if ([platform isEqualToString:@"iPad3,2"])  return @"iPad_3(GSM/CDMA)"; 
    else if ([platform isEqualToString:@"iPad3,3"])  return @"iPad_3(GSM)"; 
    else if ([platform isEqualToString:@"iPad3,4"])  return @"iPad_3(GSM)"; 
    else if ([platform isEqualToString:@"iPad2,5"])  return @"iPad_mini_1G"; 
    else if ([platform isEqualToString:@"i386"])   return @"Simulator"; 
    else if ([platform isEqualToString:@"x86_64"])  return @"Simulator"; 
    return platform; 
} 
0

你是在這裏得到很多答案意見爲什麼你不應該這樣做,並正在給你的替代代碼,但你沒有得到任何實際的答案你的問題。如果你想確定究竟是你正在運行哪個設備(無論你想要什麼目的......不要讓其他開發者假裝知道你想要完成什麼),你可以使用UIDeviceHardware第三方類。你可以在這裏找到它:

https://github.com/fahrulazmi/UIDeviceHardware

您只需撥打:

NSString *platformString = [UIDeviceHardware platformString]; 

,它將返回該設備。在你的情況,你會尋找到platformString匹配任何這些:

@"iPad 2 (WiFi)" 
@"iPad 2 (GSM)" 
@"iPad 2 (CDMA)"