Подтвердить что ты не робот

API для определения того, работает ли на iPhone или iPad

Есть ли API для проверки во время выполнения, выполняетесь ли вы на iPhone или iPad?

Один из способов, который я могу придумать, - использовать

[[UIDevice currentDevice] model];

И обнаружите существование строки @ "iPad" - которая кажется немного хрупкой.

В 3.2 SDK я вижу, что UIDevice также имеет свойство, которое действительно то, что я ищу, но не работает для pre-3.2 (очевидно):

[[UIDevice currentDevice] userInterfaceIdiom]; 

Существуют ли другие способы, кроме проверки наличия @ "iPad" для универсального приложения?

4b9b3361

Ответ 1

Оформить заказ UI_USER_INTERFACE_IDIOM.

Возвращает идиому интерфейса, поддерживаемую текущим устройством.

Возвращаемое значение
UIUserInterfaceIdiomPhone, если устройство является iPhone или iPod touch или UIUserInterfaceIdiomPad, если устройство является iPad.

UIUserInterfaceIdiom

Тип интерфейса, который должен использоваться на текущем устройстве

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;

Ответ 2

Только для моей справки:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

или используйте #define

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

Однако, если вы используете isPhone по всему вашему коду, это в целом плохая практика. Используйте шаблон factory и полиморфизм, чтобы содержать ваши инструкции if, поэтому вы получаете объекты, созданные для телефона или iPad, а затем работаете с ними.

Добавлен

Я использую это решение по всему моему коду. Он добавляет стандартный шаблон factory в alloc.

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

Затем мои выделения выглядят следующим образом:

+alloc { ALLOC_PER_DEVICE(); }

И я добавляю подкласс под названием TheClassPhone для версии телефона.

Примечание.. Поскольку в Objective-C нет множественного наследования, использование наследования для решения ваших проблем немного завышено (т.е. оно не работает, если у вас есть подклассы подклассов). Ничего хорошего if, когда вам это нужно.

Ответ 3

  • Проверяйте наличие свойства userInterfaceIdiom, ответы на него отвечаютToSelector:. Если этого не существует, мы находимся на устройстве до 3.2, а не iPad.
  • Если userInterfaceIdiom существует, используйте его.

Изменить:... что явно соответствует макросу UI_USER_INTERFACE_IDIOM(), поэтому используйте его.:)

Ответ 4

Вы можете проверить, запускаете ли приложение приложение на iPhone или iPad, используя следующий код:

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