iPad 2检测

时间:2011-03-17 10:41:59

标签: objective-c ipad ipad-2 ios

由于我没有iPad 2,因此在调用[[UIDevice currentDevice] model]时我需要知道它返回的内容。我认为它只返回“iPad”,但似乎我错了。

有人可以告诉我吗?

由于

11 个答案:

答案 0 :(得分:27)

检查带相机的iPad。

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

请注意,通常最好检测特定功能,而不是根据模型/版本检测进行全面假设。例如,如果您需要相机,请明确测试相机;如果您需要根据可用的RAM量调整UI质量,test for physical RAM;另请注意a comment I wrote,它强调了使用模型检测的危险。

答案 1 :(得分:13)

从不model属性用于显示信息用途或诊断输出之外的任何其他内容。它不能保证被保留,如果你依赖它,你会不必要地切断新设备。

许多iPhone应用程序无法在iPad的兼容模式下使用,因为他们检查了model属性,如果不是iPhone / iPod,则他们没有做任何事情。

答案 2 :(得分: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

答案 3 :(得分:7)

UIScreen + Retina.h     #import

@interface UIScreen(Retina)

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


@end

UIScreen + Retina.m

#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 HIGH / LOW 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;

    }
}

答案 4 :(得分:4)

我认为你可以测试它的规模

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

答案 5 :(得分: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
}

答案 6 :(得分:1)

UIDevice Class Reference应该有所帮助。有关更具体的解决方案,请尝试this SO question

至于你的第二个问题,测试分辨率的最佳方法是获得一个类似于iPad3的PPI数量的显示器。不幸的是,你可能无法做到。测试任何应用程序的最佳方法是在实际设备上。

答案 7 :(得分:1)

此行将打印设备版本:

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

答案 8 :(得分: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 :(得分:0)

您可以从以下网站获取所需的所有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;
}

答案 10 :(得分:0)

你在这里得到了很多答案,说明意见为什么你不应该这样做并给你替代代码,但你没有得到任何实际的回答你的问题。如果您想确定完全您正在运行的设备(无论您想要什么目的......不要让其他开发者假装知道您要完成的任务),您可以使用UIDeviceHardware第三方课程。NSString *platformString = [UIDeviceHardware platformString]; 你可以在这里找到它:

https://github.com/fahrulazmi/UIDeviceHardware

您只需致电:

platformString

它将返回设备。在您的情况下,您希望将@"iPad 2 (WiFi)" @"iPad 2 (GSM)" @"iPad 2 (CDMA)" 与以下任何内容相匹配:

l = [[[0, 4], 1], [2, 3], 5]]