6

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

有人可以告诉我吗?

谢谢

4

11 回答 11

27

检查带摄像头的 iPad。

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

请注意,检测特定特征通常比基于模型/版本检测做出全面假设要好。例如,如果您需要相机,则明确测试相机;如果您需要根据可用 RAM 量调整 UI 质量,请测试物理 RAM;等等。还要注意我写的一条评论,它强调了使用模型检测的危险。

于 2011-04-26T01:25:02.770 回答
13

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

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

于 2011-03-17T10:50:36.413 回答
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
于 2011-12-04T11:06:50.620 回答
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

用法

#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 高/低分辨率

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

    }
}
于 2012-03-08T11:04:14.153 回答
4

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

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[[UIScreen mainScreen] scale] == 2.0) {
        // retina display
    } 
}
于 2012-03-08T05:23:53.870 回答
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
}
于 2011-12-16T23:58:56.933 回答
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);
于 2012-04-09T08:39:03.840 回答
1

UIDevice 类参考应该会有所帮助。有关更具体的解决方案,请尝试这个 SO question

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

于 2012-03-08T05:22:38.597 回答
0

首先我应该提到,我花了很多时间来弄清楚为什么 ipad 模拟器“说”它是 iphone。对我来说,事实证明我只需要将它切换到通用:

在此处输入图像描述

这是我认为是相当典型的检测代码的代码。还有其他可能也可以工作,但是...

// 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);
}
于 2011-08-25T00:52:12.293 回答
0

您可以从以下网站获取所有 IPad2 返回型号或您想要的 iOS 设备型号: 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;
}
于 2012-11-09T13:13:20.963 回答
0

您在这里得到了很多答案,这些答案说明了您为什么不应该这样做并为您提供替代代码的意见,但您没有得到任何实际问题的答案。如果您想确切地确定您在哪个设备上运行(出于您想要的任何目的......不要让其他开发人员假装知道您正在尝试完成什么),您可以使用UIDeviceHardware第三方类。你可以在这里找到它:

https://github.com/fahrulazmi/UIDeviceHardware

您只需调用:

NSString *platformString = [UIDeviceHardware platformString];

它将返回设备。在您的情况下,您希望与以下platformString任何一项相匹配:

@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"
于 2016-11-24T18:00:04.960 回答