обнаружение iPad 2 - PullRequest
       6

обнаружение iPad 2

6 голосов
/ 17 марта 2011

Поскольку у меня нет iPad 2, мне нужно знать, что он возвращает при вызове модели [[UIDevice currentDevice]]. Я думал, что он возвращает только «iPad», но, похоже, я ошибаюсь.

Может кто-нибудь дать мне знать?

Спасибо

Ответы [ 11 ]

27 голосов
/ 26 апреля 2011

Проверьте наличие iPad с камерой.

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

Обратите внимание, что, как правило, лучше обнаруживать определенные функции, чем делать общие предположения на основе определения модели / версии.Например, если вам нужна камера, то проверьте ее явно;если вам нужно настроить качество пользовательского интерфейса в зависимости от объема доступной оперативной памяти, проверить физическую память ;и т. д. Также обратите внимание на комментарий, который я написал , в котором подчеркивается опасность использования определения модели.

13 голосов
/ 17 марта 2011

Никогда использовать свойство model для чего-либо другого, кроме его отображения в информационных целях или для диагностики. Сохранение не гарантируется, и если вы полагаетесь на него, вы без необходимости отключаете новые устройства по мере их поступления.

Многие приложения для iPhone не могут использоваться в режиме совместимости с iPad только потому, что они проверили свойство model и, если это не iPhone / iPod, они ничего не сделали.

9 голосов
/ 04 декабря 2011

Чтобы получить точную строку модели, например, «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
7 голосов
/ 08 марта 2012

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"

// /3954948/kak-provesti-razlichie-mezhdu-iphone4-i-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;

    }
}
4 голосов
/ 08 марта 2012

Я думаю, вы можете проверить его масштаб

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[[UIScreen mainScreen] scale] == 2.0) {
        // retina display
    } 
}
2 голосов
/ 17 декабря 2011

Если вы используете OpenGL, вы можете посмотреть на модель графического процессора. 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 голос
/ 09 апреля 2012

В этих строках будет напечатана версия устройства:

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 голос
/ 08 марта 2012

Ссылка на класс UIDevice должна помочь. Для более конкретных решений, попробуйте этот вопрос .

Что касается вашего второго вопроса, лучший способ проверить разрешение - это получить дисплей, аналогичный числу PPI iPad3,1. К сожалению, вы, вероятно, не сможете. Лучший способ протестировать любое приложение - на реальном устройстве.

0 голосов
/ 24 ноября 2016

Здесь вы получаете много ответов, в которых говорится мнений о том, почему вы не должны этого делать, и вы даете альтернативный код, но вы не получаете никаких реальных ответов на свой вопрос.Если вы хотите точно определить , на каком устройстве вы работаете (для какой бы цели вы ни захотели ... не позволяйте другим разработчикам делать вид, что они знают, чего вы пытаетесь достичь), вы можете использовать UIDeviceHardware сторонний класс.Вы можете найти его здесь:

https://github.com/fahrulazmi/UIDeviceHardware

Вы просто позвоните:

NSString *platformString = [UIDeviceHardware platformString];

И устройство вернется.В вашем случае вы хотели бы сопоставить platformString с любым из следующих:

@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"
0 голосов
/ 09 ноября 2012

Вы можете получить всю возвращаемую модель 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;
}
...