iPad 2检测

6

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

有人可以告诉我吗?

谢谢


正如在另一个问题中所指出的那样,这通常是错误的问题。 - ohmantics
11个回答

27

检查一下是否有带摄像头的iPad。

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

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


谢谢。我自己没想到会这么远。:-D - Sandro Meier
3
这是可以想象的,但似乎不太可能未来任何一款iPad都不包含摄像头。因此,除非原帖作者想要排除以后的型号,否则这个方法将完美地解决问题。我想变量可以重命名为isIPad2OrLater,以使其更清晰易懂,并更有可能在未来保持正确。 - Marcelo Cantos
"新iPad"和"iPad mini"上都有摄像头,所以这个答案现在是错误的。 - hariseldon78
@hariseldon78:我可能错了,但我的猜测(当时和现在)是OP试图检测任何比原始iPad更新的设备。我无法想象当时有任何软件明确希望检测iPad 2,但同时避免检测任何更新设备。事实上,在我之前三个评论中,我就已经解决了这个问题。 - Marcelo Cantos
@user1111:这已经在之前的评论中讨论过了。 - Marcelo Cantos
显示剩余5条评论

13

永远不要将model属性用于除了显示信息或诊断输出之外的任何其他用途。它不能保证被保存,如果您依赖于它,则会在新设备到来时不必要地切断它。

很多 iPhone 应用程序不能在 iPad 的兼容模式下使用,只是因为它们检查了 model 属性,如果它不是 iPhone / iPod,它们就不做任何操作。


2
不要检测 iPad 2,而是检测 iPad 2 的功能。很有可能 iPad 3 和其他设备也会拥有这些功能。 - Tomas Vana
获取一个模型仍然有用,可以避免检查需要几秒钟的AGPS。例如,如果在模型字符串中有一个iPhone,您就知道该设备具有AGPS。如果您得到一个未知的字符串,仍然可以使用回退。 - Jano
1
iPad n+1的一些功能(例如更多的内存,更好的性能)最好用“不是iPad n或以下”的话来概括。我认为设备检测有时可以,只要你从最差的设备开始检测,而不是从(当前)最好的设备向下检测,当你知道旧设备存在内存或帧速问题时,你需要将其未来化。在Web开发或可能在开发其他操作系统(例如Android)时,能力检测更可取,因为环境范围更广。 - Danyal Aytekin

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

7

UIScreen+Retina.h

#导入

@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"

//https://dev59.com/iHA75IYBdhLWcg3wdIl0

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;

    }
}

4
我认为你可以测试它的规模。
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[[UIScreen mainScreen] scale] == 2.0) {
        // retina display
    } 
}

iPad 2没有视网膜显示屏。此外,我认为显示分辨率并不是检测设备的正确方式。 - Koraktor

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
这几行代码将会输出设备的版本信息:
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);

1

UIDevice类参考 可以帮助你。如果需要更具体的解决方案,可以尝试这个Stack Overflow问题

至于你的第二个问题,测试分辨率最好的方法是获取一个与iPad3,1像素密度相似的显示屏。不幸的是,这可能不太容易。测试任何应用程序的最好方法是在实际设备上进行。


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接