Objective c ipad2检测

Objective c ipad2检测,objective-c,ipad,ipad-2,ios,Objective C,Ipad,Ipad 2,Ios,因为我没有iPad2,所以我需要知道调用[[UIDevice currentDevice]model]时它会返回什么。我以为它只返回“iPad”,但似乎我错了 有人能告诉我吗 谢谢切勿将model属性用于除显示信息或诊断输出以外的任何其他用途。它不能保证被保存,如果你依赖它,你就不必要地在新设备出现时切断它们 许多iPhone应用程序无法在iPad的兼容模式下使用,只是因为它们检查了model属性,如果不是iPhone/iPod,它们什么也不做。检查是否有带摄像头的iPad BOOL isIPa

因为我没有iPad2,所以我需要知道调用[[UIDevice currentDevice]model]时它会返回什么。我以为它只返回“iPad”,但似乎我错了

有人能告诉我吗


谢谢

切勿将
model
属性用于除显示信息或诊断输出以外的任何其他用途。它不能保证被保存,如果你依赖它,你就不必要地在新设备出现时切断它们


许多iPhone应用程序无法在iPad的兼容模式下使用,只是因为它们检查了
model
属性,如果不是iPhone/iPod,它们什么也不做。

检查是否有带摄像头的iPad

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

请注意,通常最好检测特定的特性,而不是基于模型/版本检测做出笼统的假设。例如,如果您需要一个摄像头,则显式测试该摄像头;如果您需要根据可用RAM的数量调整UI质量;等等。还请注意,这突出了使用模型检测的危险。

首先,我应该提到,我花了很多时间才弄明白为什么ipad模拟器“说”它是iphone。对我来说,我只需要将它切换到universal:

这是我认为非常典型的检测代码。还有一些可能也有用,但是

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

要获得精确的模型字符串,例如“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
#导入“YourDeviceDetectionClass.h”
#包括
@实现YourDeviceDetectionClass
+(NSString*)模型字符串
{
结构utsname平台;
int rc=解除警报(&平台);
如果(rc==-1)
{
//错误。。。
返回零;
}
其他的
{
//将C字符串转换为NSString
返回[NSString stringWithCString:platform.machine编码:NSUTF8StringEncoding];
}
}
@结束

如果您使用的是OpenGL,您可以查看GPU模型。iPad1有一个PowerVR SGX 535,iPad2有一个PowerVR SGX 543

const char * deviceStr = (const char *)glGetString(GL_RENDERER);
if (!strcmp(deviceStr, "PowerVR SGX 535")) {
    // iPad 1
}
else {
    // iPad 2 or later
}
应该有帮助。要获得更具体的解决方案,请尝试


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

我认为您可以按比例测试它

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[[UIScreen mainScreen] scale] == 2.0) {
        // retina display
    } 
}
屏幕+视网膜 #进口

@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
用法

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

if ([[UIScreen mainScreen] isRetina]) {
    // Retina display
}
IPAD/IPHONE高/低分辨率

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

    }
}

此行将打印设备版本:

iPad1:平台:iPad1,1

iPad2:平台:iPad2,1

iPad3:平台:iPad3,3

iphone4s:平台: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);

您可以从以下网站获得所需的所有IPad2返回型号或iOS设备型号:

您还可以使用以下代码直接检索模型:

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

你在这里得到了很多答案,这些答案陈述了你为什么不应该这样做的观点,并且给了你其他的代码,但是你没有得到你问题的任何实际答案。如果您想准确地确定您正在运行的设备(无论出于何种目的…不要让其他开发人员假装知道您要完成的任务),您可以使用
UIDeviceHardware
第三方类。你可以在这里找到它:

您只需拨打:

NSString *platformString = [UIDeviceHardware platformString];
它将返回设备。在您的情况下,您需要将
platformString
与以下任何一项匹配:

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

不要检测iPad2,检测iPad2的功能。很可能iPad3和其他设备也会有这样的产品。购买一个型号对于避免检查AGP仍然很有用,因为AGP需要几秒钟的时间。例如,如果模型字符串中有一个iPhone,您就知道该设备有AGP。如果你得到一个未知字符串,你仍然可以使用回退。iPadN+1的一些功能(例如,更多的内存,更好的性能)最好用“不是iPadN或更低的iPad”来概括。我认为设备检测有时是可以的,只要你知道旧设备上存在内存或帧速率问题时,通过从最差的设备开始检测,而不是从(当前)最好的设备开始检测,来证明它是可行的。在web开发中,或者在为环境范围更广的其他操作系统(如Android)开发时,性能检测更可取。谢谢。我自己也没想到这么远-这是一个好黑客!但基于摄像头的检测可能会导致更多型号的ipad出现问题。不过现在我还是会用这个黑客。谢谢;)@oberthelot:这是可以想象的,但iPad的未来版本似乎不太可能排除摄像头。因此,除非OP想要排除以后的模型,否则这将很好地工作。我想这个变量可以重命名为
isIPad2OrLater
,以使它更清晰,并且在将来更可能保持为真。很好!iPad1上没有摄像头:-d在“新iPad”和“iPad mini”上都有摄像头,所以这个答案现在完全错了。正如在另一个问题中所指出的,这通常是错误的问题。效果很好!比任何其他解决方案都好。谢谢你,朋友!iPad2没有视网膜显示器。此外,我认为显示器分辨率不是检测设备的正确方法。
@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"