Определить устройство (iPhone, iPod Touch) с iOS

Есть ли способ определить устройство, на котором запущено приложение. Я хочу различать iPhone и iPod Touch, если это возможно.

Использует ли класс UIDeviceHardware недокументированные и запрещенные библиотеки?

user223034 02.12.2009 19:22

Нет, они задокументированы. developer.apple.com/iphone/library/documentation/System/…

lawrence 09.12.2009 20:25

В потоке, содержащем этот ответ, есть несколько неплохих решений.

clearlight 02.01.2017 10:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
371
3
193 505
31
Перейти к ответу Данный вопрос помечен как решенный

Ответы 31

Ответ принят как подходящий

Вы можете использовать класс UIDevice следующим образом:

NSString *deviceType = [UIDevice currentDevice].model;

if ([deviceType isEqualToString:@"iPhone"])
    // it's an iPhone

@jeeva: Код в этой ссылке - это проверка во время компиляции для универсальных приложений (приложений, которые компилируются отдельно для iPhone и iPad). Этот код - проверка во время выполнения. Также имейте в виду, что этот вопрос и ответ были написаны задолго до появления iPad.

Adam Rosenfield 15.09.2010 19:17

@ Адам, я согласен с вами ... вы очень давно написали ответ, это хорошая работа ... я сказал, что вместо использования модели вы можете использовать UIUserInterfaceIdiomPad, который предоставляется только для этой цели ...

jeeva 16.09.2010 08:26

@jeeva, я не думаю, что это поддерживается в ОС 3.0

Anil Sivadas 29.10.2010 15:35

Могу я предложить снять отметку с этого ответа как с лучшего и пометить следующий, с полным кодом класса UIDeviceHardware, как лучший, пожалуйста?

snibbe 19.06.2011 02:08

@AnilSivadas: UI_USER_INTERFACE_IDIOM()является безопасно использовать в приложениях, которые все еще поддерживают iOS <3.2: это макрос в UIDevice.h, специально записанный по умолчанию для UIUserInterfaceIdiomPhone в таких старых версиях iOS.

mklement0 08.07.2012 23:34

Работает отлично. Я бы только перешел на [deviceType containsString:@"iPhone"], чтобы он работал и в симуляторе.

EricWasTaken 25.09.2015 04:48

Не стесняйтесь использовать этот класс (gist @ github)

CODE REMOVED AND RELOCATED TO

https://gist.github.com/1323251

ОБНОВИТЬ (14.01.11)

Очевидно, что этот код к настоящему времени немного устарел, но его, безусловно, можно обновить с помощью кода в этом потоке, предоставленного Brian Robbins, который включает аналогичный код с обновленными моделями. Спасибо за поддержку в этой теме.

Это работает и с iPad? Я знаю, что потребуется еще один оператор if, но вопрос в том, хранит ли iPad информацию таким же образом? (IE: if ([platformisEqualToString: @ "ipad1,1"]) return @ "iPad 1G";) Спасибо за это!

Scott 09.03.2010 00:59

Честно говоря, не могу вам сказать. Я не занимался разработкой для iPad.

Dutchie432 11.03.2010 17:11

-1 Это совершенно ненадежно. Как только выходит новое устройство, этот код ломается. Кроме того, анализ вывода sysctl - глупая идея, особенно для такой простой задачи, как получение модели устройства.

Dave DeLong 12.01.2011 20:52

@Dave: Код не ломается, он просто возвращает чуть менее красивую строку. У вас есть лучший способ получить модель устройства? Под моделью я подразумеваю не просто «iPhone» или «iPod», а конкретную версию.

winsmith 14.01.2011 11:59

я не понимаю, почему вы не определяете их как методы класса, поскольку вы не поддерживаете какое-либо состояние. Просто замените - (NSString *) на + (NSString *), и вы сэкономите выделение / освобождение при его использовании.

Ben G 03.03.2011 01:48

Просто добавил одну недостающую строку в ответ Brian Robbins для Verizon iPhone 4. Его аппаратный код должен быть iPhone3,2.

Di Wu 20.03.2011 11:19

Он считает, что эти значения необходимо кэшировать, чтобы не вызывать каждый раз двадцать или более if-then-else.

tt.Kilew 12.04.2011 15:37

Каждый раз? Вы должны иметь возможность вызвать этот класс / метод один раз и получить правильное значение для использования во всем приложении. Не уверен, в чем именно заключаются ваши возражения.

Dutchie432 12.04.2011 18:07

@diwup - Я не вижу iPhone3.2 в наших журналах доступа. Однако я вижу большое количество устройств iPhone3.3. Около 4% наших обращений происходят из-за этого. Предполагаю, что это телефон Verizon

DougW 20.04.2011 02:35

Я сделал обновление, чтобы добавить iPhone 3,3, который является идентификатором модели в моем Verizon iPhone 4. И я нигде не могу найти упоминания об iPhone 3,2, кроме сообщений в Интернете до Verizon; не уверен, что устройство существует ...

Chris Markle 23.04.2011 00:05

когда я запускаю это ... UIDeviceHardware * h = [[UIDeviceHardware alloc] init]; [self setDeviceModel: [h platformString]]; [ч выпуск]; я получаю предупреждение «Метод 'setDevice:' не найден». Я добавил это в свой заголовочный файл #import «UIDeviceHardware.h» #include <sys / types.h> #include <sys / sysctl.h>

OscarTheGrouch 10.05.2011 08:28

@ Dutchie432: Я отредактировал ваш ответ: сделал класс как категорию UIDevice для простоты использования, добавил возвращаемый тип enum, обновил устаревший вызов, поместил вызов базовой платформы как частный только для внутреннего использования. Конечно, я протестировал этот новый код, чтобы убедиться, что он по-прежнему полностью функционален.

Oliver 15.05.2011 06:45

Вау - способ полностью переписать мой код. Это не является целью редактирования, поэтому я откатил его. При редактировании не должно изменяться содержание сообщения, только его читабельность. Подробнее: meta.stackexchange.com/questions/80513/…

Dutchie432 15.05.2011 20:52

Спасибо, Джей. Этот код уже обновлялся несколько раз с момента его первой публикации. Первый пост был в октябре 2009 года, и вы можете видеть, что он был обновлен до Verizon iPhone 4.

Dutchie432 18.07.2011 13:26

Эта строка: NSString * platform = [NSString stringWithCString: machine]; , должно быть NSString * platform = [NSString stringWithUTF8String: machine]; поскольку stringWithCString устарела.

Goles 19.09.2011 17:01

@chpwn: Какие новости об iPhone 4S?

Oliver 08.10.2011 17:03

@Oliver - Добавлено. Это «iPhone4,1»

DougW 16.10.2011 19:24

@ Мистер Гандо - Проверено. Работает, отредактировал сообщение, чтобы отразить ваше предложение.

Stunner 22.10.2011 08:14

А как насчет iPod следующего поколения? Нет ли новой модели?

Stunner 22.10.2011 08:51

Я предлагаю добавить этот довольно простой фрагмент кода как суть в github или как очень небольшой проект с открытым исходным кодом. Поскольку Stack Overflow не подходит для такого рода разработки;)

Goles 22.10.2011 12:00

Только что проверил суть, и я не думаю, что новый iPad (iPad 3) пока включен. Кто-нибудь знает коды для этого?

Stunner 26.03.2012 11:52

Эта суть активно не редактируется. Вам нужно будет обновить его по своему усмотрению. Я должен предположить, что iPad3 будет iPad3,1 для первой ревизии.

Dutchie432 26.03.2012 17:07

См. Обновленную ветку сущности. Он распространяется на iPad 3: gist.github.com/2238516

Dutchie432 03.04.2012 17:03

Я считаю theiphonewiki.com/wiki/Models неплохим источником новых идентификаторов оборудования.

Besi 06.03.2013 11:34

Приятно, что последний код доступен в сущности, но исходный код не должен был удаляться. Пользователям не нужно переходить на внешний сайт, чтобы найти полный ответ. Вы должны оставить код здесь, но ссылку на суть с советом о том, что обновленная версия может быть доступна там.

Caleb 06.07.2015 21:07

Вот небольшое обновление с новыми моделями:

- (NSString *) platformString{
    NSString *platform = [self platform];
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
    if ([platform isEqualToString:@"iPod1,1"])   return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])   return @"iPod Touch 2G";
    if ([platform isEqualToString:@"iPod3,1"])   return @"iPod Touch 3G";
    if ([platform isEqualToString:@"i386"])   return @"iPhone Simulator";
    return platform;
}

Это обновление для UIDeviceHardware.m от ответ выше.

- (NSString *)platformString
{
    NSString *platform = [self platform];

    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon iPhone 4";
    if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
    if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6";
    if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6 Plus";
    if ([platform isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([platform isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([platform isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";
    if ([platform isEqualToString:@"iPod7,1"])      return @"iPod Touch 6G";
    if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
    if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
    if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
    if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
    if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([platform isEqualToString:@"iPad4,4"])      return @"iPad mini 2G (WiFi)";
    if ([platform isEqualToString:@"iPad4,5"])      return @"iPad mini 2G (Cellular)";
    if ([platform isEqualToString:@"iPad5,1"])      return @"iPad mini 4 (WiFi)";
    if ([platform isEqualToString:@"iPad5,2"])      return @"iPad mini 4 (Cellular)";
    if ([platform isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (WiFi)";
    if ([platform isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";
    if ([platform isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7 inch (WiFi)";
    if ([platform isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7 inch (Cellular)";
    if ([platform isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9 inch (WiFi)";
    if ([platform isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9 inch (Cellular)";
    if ([platform isEqualToString:@"i386"])         return @"Simulator";
    if ([platform isEqualToString:@"x86_64"])       return @"Simulator";

    return platform;
}

Извините, эта функция не приведет к бесконечному циклу из-за первой строки? Кто здесь «я»?

jakev 13.02.2012 03:22

Да, я отменил это изменение

Matthias Bauch 13.02.2012 20:21

Я видел довольно много устройств iPad3,2 в дикой природе - они появляются примерно на 1/3 частоты устройств iPad3,3.

Nick Baicoianu 21.03.2012 02:45

Почему такое название iPad-3G? Это официальное название нового iPad? Я думаю, что в iPad 4G или iPad 3 больше смысла.

Stunner 26.03.2012 11:56

Я обновился для последних платформ, используя этот ссылка на сайт

derpoliuk 27.03.2013 13:57

есть ли лучший способ сохранить эту кучу операторов if, которые не должны быть непосредственно в коде? (например, в файле plist или что-то в этом роде)

user944351 08.08.2013 17:17

Имя для каскадного сравнения NSString, дающего NSString, - NSDictionary. Имя для определения сравнения без зависимостей кода - .plist.

Fritz Anderson 31.01.2014 22:22

Обновленный список для iPhone 6 и 6 плюс находится здесь: stackoverflow.com/a/19584526/1374512

nvrtd frst 19.09.2014 09:37

Пожалуйста, обновите для iPhone 6/6 Plus. 'iPhone 6 Plus' = 'iPhone7,1', 'iPhone 6' = 'iPhone7,2'.

northtree 14.10.2014 11:17

К вашему сведению - похоже, что обновленный список хранится здесь - theiphonewiki.com/wiki/Models

user1021430 05.11.2014 01:10

Мое приложение, использующее функцию uname, недавно было отклонено обзором приложения на предмет использования непубличного API, но они просто не назвали какой-либо API в комментарии. Является ли uname безопасным в последнее время?

tedyyu 08.08.2015 13:08

что случилось с iPad Air 2?

Khanh Nguyen 19.08.2015 19:27

Более удобный

#include <sys/types.h>
#include <sys/sysctl.h>

@interface UIDevice(Hardware)

- (NSString *) platform;

- (BOOL)hasRetinaDisplay;

- (BOOL)hasMultitasking;

- (BOOL)hasCamera;

@end

@implementation UIDevice(Hardware)

- (NSString *) platform{
    int mib[2];
size_t len;
char *machine;

mib[0] = CTL_HW;
mib[1] = HW_MACHINE;
sysctl(mib, 2, NULL, &len, NULL, 0);
machine = malloc(len);
sysctl(mib, 2, machine, &len, NULL, 0);

    NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
    free(machine);
return platform;
}

- (BOOL)hasRetinaDisplay {
    NSString *platform = [self platform];
    BOOL ret = YES;
    if ([platform isEqualToString:@"iPhone1,1"]) {
        ret = NO;
    }
    else
        if ([platform isEqualToString:@"iPhone1,2"])    ret = NO;
    else 
        if ([platform isEqualToString:@"iPhone2,1"])    ret = NO;
    else 
        if ([platform isEqualToString:@"iPod1,1"])      ret = NO;
    else
        if ([platform isEqualToString:@"iPod2,1"])      ret = NO;
    else
        if ([platform isEqualToString:@"iPod3,1"])      ret = NO;
    return ret;
}

- (BOOL)hasMultitasking {
    if ([self respondsToSelector:@selector(isMultitaskingSupported)]) {
        return [self isMultitaskingSupported];
    }
    return NO;
}

- (BOOL)hasCamera {
   BOOL ret = NO;
   // check camera availability
   return ret;
}

@end

вы можете читать свойства с

NSLog(@"platform %@, retita %@, multitasking %@", [[UIDevice currentDevice] platform], [[UIDevice currentDevice] hasRetinaDisplay] ? @"YES" : @"NO" , [[UIDevice currentDevice] hasMultitasking] ? @"YES" : @"NO");

Вместо сложного дерева if / else вы можете просто проверить, равно ли [[UIScreen mainScreen] scale] 2 или нет (для iOS 5+).

Todd Lehman 01.06.2012 10:45

Не включает необходимую функцию hasVibration.

Jonny 13.03.2013 14:20

Dutchie432 и Brian Robbins предоставили отличные решения. Но по-прежнему не хватает одной модели - Verizon iPhone 4. Вот недостающая строка.

if ([platform isEqualToString:@"iPhone3,2"])    return @"iPhone 4"; //Verizon

Интересно, а вроде теперь есть айфон3,3?

makdad 27.05.2011 03:38

@makdad Да. Собственно какой-то Verizon iPhone 4 оказался 3,3.

Di Wu 01.06.2011 10:53

Кто-нибудь еще знает идентификатор iPhone 4S?

stoutyhk 12.10.2011 10:44

Просто добавляю код устройства iPhone 4S в эту ветку ...

IPhone 4S вернет строку @ "iPhone4,1".

Я добавил это в самый популярный пост

Besi 04.01.2012 13:11

Как насчет этого кода, если была выпущена новая версия, вы будете идентифицировать с последним известным устройством

- (NSString *)getModel {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *model = malloc(size);
    sysctlbyname("hw.machine", model, &size, NULL, 0);
    NSString *sDeviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];
    free(model);                              
    if ([sDeviceModel isEqual:@"i386"])      return @"Simulator";  //iPhone Simulator
    if ([sDeviceModel isEqual:@"iPhone1,1"]) return @"iPhone1G";   //iPhone 1G
    if ([sDeviceModel isEqual:@"iPhone1,2"]) return @"iPhone3G";   //iPhone 3G
    if ([sDeviceModel isEqual:@"iPhone2,1"]) return @"iPhone3GS";  //iPhone 3GS
    if ([sDeviceModel isEqual:@"iPhone3,1"]) return @"iPhone3GS";  //iPhone 4 - AT&T
    if ([sDeviceModel isEqual:@"iPhone3,2"]) return @"iPhone3GS";  //iPhone 4 - Other carrier
    if ([sDeviceModel isEqual:@"iPhone3,3"]) return @"iPhone4";    //iPhone 4 - Other carrier
    if ([sDeviceModel isEqual:@"iPhone4,1"]) return @"iPhone4S";   //iPhone 4S
    if ([sDeviceModel isEqual:@"iPod1,1"])   return @"iPod1stGen"; //iPod Touch 1G
    if ([sDeviceModel isEqual:@"iPod2,1"])   return @"iPod2ndGen"; //iPod Touch 2G
    if ([sDeviceModel isEqual:@"iPod3,1"])   return @"iPod3rdGen"; //iPod Touch 3G
    if ([sDeviceModel isEqual:@"iPod4,1"])   return @"iPod4thGen"; //iPod Touch 4G
    if ([sDeviceModel isEqual:@"iPad1,1"])   return @"iPadWiFi";   //iPad Wifi
    if ([sDeviceModel isEqual:@"iPad1,2"])   return @"iPad3G";     //iPad 3G
    if ([sDeviceModel isEqual:@"iPad2,1"])   return @"iPad2";      //iPad 2 (WiFi)
    if ([sDeviceModel isEqual:@"iPad2,2"])   return @"iPad2";      //iPad 2 (GSM)
    if ([sDeviceModel isEqual:@"iPad2,3"])   return @"iPad2";      //iPad 2 (CDMA)

    NSString *aux = [[sDeviceModel componentsSeparatedByString:@","] objectAtIndex:0];

//If a newer version exist
    if ([aux rangeOfString:@"iPhone"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] intValue];
        if (version == 3) return @"iPhone4"
        if (version >= 4) return @"iPhone4s";

    }
    if ([aux rangeOfString:@"iPod"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPod" withString:@""] intValue];
        if (version >=4) return @"iPod4thGen";
    }
    if ([aux rangeOfString:@"iPad"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPad" withString:@""] intValue];
        if (version ==1) return @"iPad3G";
        if (version >=2) return @"iPad2";
    }
    //If none was found, send the original string
    return sDeviceModel;
}

Мне не нравится то, что ты делаешь. Он возвращает неверные ссылки для неизвестных устройств. Хорошая идея, но плохая реализация.

Oliver 13.12.2011 05:13

@Oliver Что вы предлагаете? Вы должны представить, что если было выпущено новое устройство, вы не можете изменить код, и для меня это вызывает ошибку.

Rodrigo 13.12.2011 20:00

Как идентифицировать iPhone 5 / iPod 5? @ "iPhone5,1" @ "iPod5,1" - правильный способ использования?

joe 19.10.2012 16:02

Основываясь на очень хороших ответах выше, вот что я придумал. Это очень похоже на ответ @ Rodrigo, но устраняет озабоченность @Oliver из комментария к этому ответу. Это также дает возможность включить строку модели в строку вывода.

+ (NSString *) deviceModel {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *model = malloc(size);
    sysctlbyname("hw.machine", model, &size, NULL, 0);
    NSString *deviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];
    free(model);      

    return deviceModel;
}

+ (NSString *) deviceName {
    NSString *deviceModel = [DeviceGateway deviceModel];                    

    if ([deviceModel isEqual:@"i386"])      return @"Simulator";  //iPhone Simulator
    if ([deviceModel isEqual:@"iPhone1,1"]) return @"iPhone1G";   //iPhone 1G
    if ([deviceModel isEqual:@"iPhone1,2"]) return @"iPhone3G";   //iPhone 3G
    if ([deviceModel isEqual:@"iPhone2,1"]) return @"iPhone3GS";  //iPhone 3GS
    if ([deviceModel isEqual:@"iPhone3,1"]) return @"iPhone4";    //iPhone 4 - AT&T
    if ([deviceModel isEqual:@"iPhone3,2"]) return @"iPhone4";    //iPhone 4 - Other carrier
    if ([deviceModel isEqual:@"iPhone3,3"]) return @"iPhone4";    //iPhone 4 - Other carrier
    if ([deviceModel isEqual:@"iPhone4,1"]) return @"iPhone4S";   //iPhone 4S
    if ([deviceModel isEqual:@"iPod1,1"])   return @"iPod1stGen"; //iPod Touch 1G
    if ([deviceModel isEqual:@"iPod2,1"])   return @"iPod2ndGen"; //iPod Touch 2G
    if ([deviceModel isEqual:@"iPod3,1"])   return @"iPod3rdGen"; //iPod Touch 3G
    if ([deviceModel isEqual:@"iPod4,1"])   return @"iPod4thGen"; //iPod Touch 4G
    if ([deviceModel isEqual:@"iPad1,1"])   return @"iPadWiFi";   //iPad Wifi
    if ([deviceModel isEqual:@"iPad1,2"])   return @"iPad3G";     //iPad 3G
    if ([deviceModel isEqual:@"iPad2,1"])   return @"iPad2";      //iPad 2 (WiFi)
    if ([deviceModel isEqual:@"iPad2,2"])   return @"iPad2";      //iPad 2 (GSM)
    if ([deviceModel isEqual:@"iPad2,3"])   return @"iPad2";      //iPad 2 (CDMA)

    NSString *aux = [[deviceModel componentsSeparatedByString:@","] objectAtIndex:0];

    //If a newer version exists
    if ([aux rangeOfString:@"iPhone"].location != NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] intValue];
        if (version == 3) return @"iPhone4";
        if (version == 4) return @"iPhone4s";
        return @"Newer iPhone";
    }
    if ([aux rangeOfString:@"iPod"].location != NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPod" withString:@""] intValue];
        if (version == 4) return @"iPod4thGen";
        return @"Newer iPod";
    }
    if ([aux rangeOfString:@"iPad"].location != NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPad" withString:@""] intValue];
        if (version == 1) return @"iPad3G";
        if (version == 2) return @"iPad2";
        return @"Newer iPad";
    }

    //If none was found, send the original string
    return deviceModel;
}

+ (NSString *) deviceNameWithDeviceModel:(BOOL)shouldIncludeDeviceModel {
    if (shouldIncludeDeviceModel) {
        return [NSString stringWithFormat:@"%@ (%@)", [DeviceGateway deviceName], [DeviceGateway deviceModel]];
    }

    return [DeviceGateway deviceName];
}

Можем ли мы использовать его для приложения в AppStore? использует ли этот код частный API (sysctlbyname)? Tx за вашу помощь

fvisticot 18.01.2012 19:57

Здесь не используются частные API. Это прошло автоматическую проверку в XCode.

benvolioT 22.01.2012 10:04

Откуда взять DeviceGateway?

Nizzy 11.12.2012 09:12

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

benvolioT 12.12.2012 20:52
if ([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad) {
    //Device is ipad 
}else{
    //Device is iphone
}

Если вы посмотрите на вопрос, Роб упоминает: «Я хочу различать iPhone и iPod Touch, если это возможно». Ваше решение не решает эту проблему.

stephenmuss 05.07.2012 11:05

Я использую это в своем приложении. Актуально по состоянию на декабрь 2012 г.

- (NSString *) platformString {
    // Gets a string with the device model
    size_t size;  
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);  
    char *machine = malloc(size);  
    sysctlbyname("hw.machine", machine, &size, NULL, 0);  
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];  
    free(machine); 

    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 2G";
    if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,2"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,3"])    return @"iPhone 4 (CDMA)";    
    if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
    if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";

    if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch (1 Gen)";
    if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch (2 Gen)";
    if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch (3 Gen)";
    if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch (4 Gen)";
    if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";

    if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([platform isEqualToString:@"iPad1,2"])      return @"iPad 3G";
    if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2";
    if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2";
    if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini";
    if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3";
    if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4";
    if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";

    if ([platform isEqualToString:@"i386"])         return @"Simulator";
    if ([platform isEqualToString:@"x86_64"])       return @"Simulator";

    return platform;
}  

он выдает предупреждение о том, что «Неявное объявление функции 'sysctlbyname' недействительно в C99» в строке sysctlbyname («hw.machine», NULL, & size, NULL, 0);

Ans 30.05.2013 11:28

Чтобы устранить предупреждение «Неявное объявление функции ..», вам необходимо добавить следующее: #import <sys/sysctl.h>

Brabbeldas 12.03.2015 09:18
- (BOOL)deviceiPhoneOriPod
  {
    NSString *deviceType = [UIDevice currentDevice].model;
    if ([deviceType rangeOfString:@"iPhone"].location!=NSNotFound)
      return YES;
    else
      return NO;
  }

Добавляя к коду Араша, мне все равно, какую модель я использую для моего приложения, я просто хочу знать, какое устройство, поэтому я могу протестировать следующее:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            NSLog(@"I'm definitely an iPad");
    } else {
    NSString *deviceType = [UIDevice currentDevice].model;
                if ([deviceType rangeOfString:@"iPhone"].location!=NSNotFound)
                {
                    NSLog(@"I must be an iPhone");

                } else {
                    NSLog(@"I think I'm an iPod");

                }
}

Мне нравятся вещи Эрики Садун. Она включает устройства AppleTV и другие устройства, о которых вы, возможно, и не подумали.

https://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.h

NSString *deviceType = [UIDevice currentDevice].model;

Я пошел немного дальше и преобразовал большой блок isEqualToString в классификацию битовых масок для типа устройства, поколения и другого квалификатора после запятой (я называю его подгенерацией). Он заключен в класс с одноэлементным вызовом SGPlatform, который позволяет избежать множества повторяющихся строковых операций. Код доступен https://github.com/danloughney/spookyGroup

Класс позволяет делать такие вещи:

if ([SGPlatform iPad] && [SGPlatform generation] > 3) {
    // set for high performance
}

а также

switch ([SGPlatform deviceMask]) {
case DEVICE_IPHONE:
    break;
case DEVICE_IPAD:
    break;
case DEVICE_IPAD_MINI:
    break;
}

Классификация устройств находится в методе platformBits. Этот метод должен быть хорошо знаком читателям этой ветки. Я классифицировал устройства по их типу и поколению, потому что меня больше всего интересует общая производительность, но источник можно настроить, чтобы предоставить любую интересующую вас классификацию, экран сетчатки, сетевые возможности и т. д.

Я хотел бы добавить, что для получения цвета передней части и корпуса устройства есть частный API:

UIDevice *device = [UIDevice currentDevice];
SEL selector = NSSelectorFromString([device.systemVersion hasPrefix:@"7"] ? @"_deviceInfoForKey:" :  @"deviceInfoForKey:");
if ([device respondsToSelector:selector]) {
    NSLog(@"DeviceColor: %@ DeviceEnclosureColor: %@", [device performSelector:selector withObject:@"DeviceColor"], [device performSelector:selector withObject:@"DeviceEnclosureColor"]);
}

Я написал об этом в блоге и предоставил образец приложения:

http://www.futuretap.com/blog/device-colors/

Приведенный ниже фрагмент кода должен помочь:

 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
   // iPhone device
 }
 else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
   // iPad device
 }
 else {
  // Other device i.e. iPod
 }
NSString *deviceType = [[UIDevice currentDevice] systemName];

Могу заверить, что предложенный выше будет работать в iOS 7 и выше. Я считаю, что это будет работать и в iOS 6. Но я в этом не уверен.

Обновленные строки платформы для iPad Air 2 и iPad mini 3:

- (NSString *)platformString
{
    NSString *platform = [self platform];

    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon iPhone 4";
    if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
    if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";
    if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
    if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
    if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
    if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
    if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";

    if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([platform isEqualToString:@"iPad4,4"])      return @"iPad mini 2G (WiFi)";
    if ([platform isEqualToString:@"iPad4,5"])      return @"iPad mini 2G (Cellular)";

    if ([platform isEqualToString:@"iPad4,7"])      return @"iPad mini 3 (WiFi)";
    if ([platform isEqualToString:@"iPad4,8"])      return @"iPad mini 3 (Cellular)";
    if ([platform isEqualToString:@"iPad4,9"])      return @"iPad mini 3 (China Model)";

    if ([platform isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (WiFi)";
    if ([platform isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";
    if ([platform isEqualToString:@"iPad6,8"])      return @"iPad Pro";

    if ([platform isEqualToString:@"i386"])         return @"Simulator";
    if ([platform isEqualToString:@"x86_64"])       return @"Simulator";

    return platform;
}

Вы можете проверить GBDeviceInfo на GitHub, также доступном через CocoaPods. Он предоставляет простой API для определения различных свойств с поддержкой всех последних устройств:

  • Семейство устройств

[GBDeviceInfo deviceDetails].family == GBDeviceFamilyiPhone;

  • Модель устройства

[GBDeviceInfo deviceDetails].model == GBDeviceModeliPhone6.

Для получения дополнительной информации см. Прочти меня.

Возможные долги

[[UIDevice currentDevice] model];

являются iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

Если вы хотите знать, какое оборудование iOS разрушает, например iPhone3, iPhone4, iPhone5 и т. д., Ниже приведен код для этого.


ПРИМЕЧАНИЕ: Приведенный ниже код может не содержать всю строку устройства, я с другими ребятами поддерживаю тот же код на GitHub, поэтому, пожалуйста, возьмите последний код оттуда

Цель-C: GitHub / DeviceUtil

Быстрый: GitHub / DeviceGuru


#include <sys/types.h>
#include <sys/sysctl.h>

- (NSString*)hardwareDescription {
    NSString *hardware = [self hardwareString];
    if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
    if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
    if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
    if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
    if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
    if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G";
    if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G";
    if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad";
    if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini";
    if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI";
    //there are lots of other strings too, checkout the github repo
    //link is given at the top of this answer

    if ([hardware isEqualToString:@"i386"]) return @"Simulator";
    if ([hardware isEqualToString:@"x86_64"]) return @"Simulator";

    return nil;
}

- (NSString*)hardwareString {
    size_t size = 100;
    char *hw_machine = malloc(size);
    int name[] = {CTL_HW,HW_MACHINE};
    sysctl(name, 2, hw_machine, &size, NULL, 0);
    NSString *hardware = [NSString stringWithUTF8String:hw_machine];
    free(hw_machine);
    return hardware;
}
#import <sys/utsname.h> 

NSString *iPhone = [self iPhoneVersion]; 

-(NSString*)iPhoneVersion
{
   NSString *platform;
   struct utsname systemInfo;
   uname(&systemInfo);
   platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

   if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
   if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
   if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
   if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
   if ([platform isEqualToString:@"iPhone3,3"])    return @"VerizoniPhone 4";
   if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
   if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
   if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
   if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
   if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
   if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
   if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
   if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
   if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
   if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
   if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
   if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
   if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
   if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";
   if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
   if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
   if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
   if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
   if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (WiFi)";
   if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
   if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
   if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
   if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
   if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
   if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
   if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
   if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
   if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
   if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
   if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
   if ([platform isEqualToString:@"iPad4,3"])      return @"iPad Air";
   if ([platform isEqualToString:@"iPad4,4"])      return @"iPad Mini 2G (WiFi)";
   if ([platform isEqualToString:@"iPad4,5"])      return @"iPad Mini 2G (Cellular)";
   if ([platform isEqualToString:@"iPad4,6"])      return @"iPad Mini 2G";
   if ([platform isEqualToString:@"iPad4,7"])      return @"iPad Mini 3 (WiFi)";
   if ([platform isEqualToString:@"iPad4,8"])      return @"iPad Mini 3 (Cellular)";
   if ([platform isEqualToString:@"iPad4,9"])      return @"iPad Mini 3 (China)";
   if ([platform isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (WiFi)";
   if ([platform isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";
   if ([platform isEqualToString:@"AppleTV2,1"])   return @"Apple TV 2G";
   if ([platform isEqualToString:@"AppleTV3,1"])   return @"Apple TV 3";
   if ([platform isEqualToString:@"AppleTV3,2"])   return @"Apple TV 3 (2013)";
   if ([platform isEqualToString:@"i386"])         return @"Simulator";
   if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
   return platform;
}

Я знаю, что ответ уже отмечен галочкой, но для справки в будущем вы всегда можете использовать размер экрана устройства, чтобы выяснить, какое это устройство:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {

    CGSize result = [[UIScreen mainScreen] bounds].size;

    if (result.height == 480) {
        // 3.5 inch display - iPhone 4S and below
        NSLog(@"Device is an iPhone 4S or below");
    }

    else if (result.height == 568) {
        // 4 inch display - iPhone 5
        NSLog(@"Device is an iPhone 5/S/C");
    }

    else if (result.height == 667) {
        // 4.7 inch display - iPhone 6
        NSLog(@"Device is an iPhone 6");
    }

    else if (result.height == 736) {
        // 5.5 inch display - iPhone 6 Plus
        NSLog(@"Device is an iPhone 6 Plus");
    }
} 

else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
       // iPad 9.7 or 7.9 inch display.
       NSLog(@"Device is an iPad.");
}

Для этого есть довольно зрелая библиотека (созданная мной) под названием SDVersion. Вы можете проверить модель запущенного устройства, размер экрана и многие другие параметры. Он также поддерживает OSX.

Пример:

      // Check for device model
      if ([SDVersion deviceVersion] == iPhone6)
           NSLog(@"You got the iPhone 6. Sweet ?!");
      else if ([SDVersion deviceVersion] == iPhone6Plus)
           NSLog(@"iPhone 6 Plus? Bigger is better!");
      else if ([SDVersion deviceVersion] == iPadAir2)
           NSLog(@"You own an iPad Air 2 ?!");

      // Check for device screen size
      if ([SDVersion deviceSize] == Screen4inch)
           NSLog(@"Your screen is 4 inches");

как использовать в быстром?

user3622576 05.11.2015 09:33

Последнее обновление - ноябрь 2020 г .: Добавлены iPhone 12, iPhone 12 miniiPhone 12 Pro, iPhone 12 Pro Max, iPhone SE (2-е поколение), iPad (8-е поколение), iPad Air (4-е поколение), Apple Watch 6, Apple Watch SE

Предыдущее обновление - июнь 2020 г .: Добавлены iPad Pro 11 2020 г. (2-е поколение), iPad Pro 12.9 2020 г. (4-е поколение), Apple Watch 5


Быстрый

(Проверено на Swift 5, Swift 4, Swift 3)

Функция ниже возвращает нить с текущим именем устройства.

func userDeviceName() -> String {
    let platform: String = {
        var size = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0,  count: Int(size))
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        return String(cString: machine)
    }()
    
    //iPhone
    if platform == "iPhone1,1"        { return "iPhone (1st generation)" }
    else if platform == "iPhone1,2"   { return "iPhone 3G" }
    else if platform == "iPhone2,1"   { return "iPhone 3GS" }
    else if platform == "iPhone3,1"   { return "iPhone 4 (GSM)" }
    else if platform == "iPhone3,2"   { return "iPhone 4 (GSM, 2nd revision)" }
    else if platform == "iPhone3,3"   { return "iPhone 4 (CDMA)" }
    else if platform == "iPhone4,1"   { return "iPhone 4S" }
    else if platform == "iPhone5,1"   { return "iPhone 5 (GSM)" }
    else if platform == "iPhone5,2"   { return "iPhone 5 (GSM+CDMA)" }
    else if platform == "iPhone5,3"   { return "iPhone 5c (GSM)" }
    else if platform == "iPhone5,4"   { return "iPhone 5c (GSM+CDMA)" }
    else if platform == "iPhone6,1"   { return "iPhone 5s (GSM)" }
    else if platform == "iPhone6,2"   { return "iPhone 5s (GSM+CDMA)" }
    else if platform == "iPhone7,2"   { return "iPhone 6" }
    else if platform == "iPhone7,1"   { return "iPhone 6 Plus" }
    else if platform == "iPhone8,1"   { return "iPhone 6s" }
    else if platform == "iPhone8,2"   { return "iPhone 6s Plus" }
    else if platform == "iPhone8,4"   { return "iPhone SE" }
    else if platform == "iPhone9,1"   { return "iPhone 7 (GSM+CDMA)" }
    else if platform == "iPhone9,3"   { return "iPhone 7 (GSM)" }
    else if platform == "iPhone9,2"   { return "iPhone 7 Plus (GSM+CDMA)" }
    else if platform == "iPhone9,4"   { return "iPhone 7 Plus (GSM)" }
    else if platform == "iPhone10,1"  { return "iPhone 8 (GSM+CDMA)" }
    else if platform == "iPhone10,4"  { return "iPhone 8 (GSM)" }
    else if platform == "iPhone10,2"  { return "iPhone 8 Plus (GSM+CDMA)" }
    else if platform == "iPhone10,5"  { return "iPhone 8 Plus (GSM)" }
    else if platform == "iPhone10,3"  { return "iPhone X (GSM+CDMA)" }
    else if platform == "iPhone10,6"  { return "iPhone X (GSM)" }
    else if platform == "iPhone11,2"  { return "iPhone XS" }
    else if platform == "iPhone11,6"  { return "iPhone XS Max" }
    else if platform == "iPhone11,8"  { return "iPhone XR" }
    else if platform == "iPhone12,1"  { return "iPhone 11" }
    else if platform == "iPhone12,3"  { return "iPhone 11 Pro" }
    else if platform == "iPhone12,5"  { return "iPhone 11 Pro Max" }
    else if platform == "iPhone12,8"  { return "iPhone SE (2nd generation)" }
    else if platform == "iPhone13,1"  { return "iPhone 12 mini" }
    else if platform == "iPhone13,2"  { return "iPhone 12" }
    else if platform == "iPhone13,3"  { return "iPhone 12 Pro" }
    else if platform == "iPhone13,4"  { return "iPhone 12 Pro Max" }
        
        //iPod Touch
    else if platform == "iPod1,1"     { return "iPod Touch (1st generation)" }
    else if platform == "iPod2,1"     { return "iPod Touch (2nd generation)" }
    else if platform == "iPod3,1"     { return "iPod Touch (3rd generation)" }
    else if platform == "iPod4,1"     { return "iPod Touch (4th generation)" }
    else if platform == "iPod5,1"     { return "iPod Touch (5th generation)" }
    else if platform == "iPod7,1"     { return "iPod Touch (6th generation)" }
    else if platform == "iPod9,1"     { return "iPod Touch (7th generation) (2019)" }
        
        //iPad
    else if platform == "iPad1,1"     { return "iPad (1st generation)" }
    else if platform == "iPad2,1"     { return "iPad 2 (Wi-Fi)" }
    else if platform == "iPad2,2"     { return "iPad 2 (GSM)" }
    else if platform == "iPad2,3"     { return "iPad 2 (CDMA)" }
    else if platform == "iPad2,4"     { return "iPad 2 (Wi-Fi, Mid 2012)" }
    else if platform == "iPad3,1"     { return "iPad (3rd generation) (Wi-Fi)" }
    else if platform == "iPad3,2"     { return "iPad (3rd generation) (GSM+CDMA)" }
    else if platform == "iPad3,3"     { return "iPad (3rd generation) (GSM)" }
    else if platform == "iPad3,4"     { return "iPad (4th generation) (Wi-Fi)"}
    else if platform == "iPad3,5"     { return "iPad (4th generation) (GSM)" }
    else if platform == "iPad3,6"     { return "iPad (4th generation) (GSM+CDMA)" }
    else if platform == "iPad6,11"    { return "iPad (5th generation) (Wi-Fi)" }
    else if platform == "iPad6,12"    { return "iPad (5th generation) (Cellular)" }
    else if platform == "iPad7,5"     { return "iPad (6th generation) (2018) (Wi-Fi)" }
    else if platform == "iPad7,6"     { return "iPad (6th generation) (2018) (Cellular)" }
    else if platform == "iPad7,11"    { return "iPad (7th generation) (2019) (Wi-Fi)" }
    else if platform == "iPad7,12"    { return "iPad (7th generation) (2019) (Cellular)" }
    else if platform == "iPad11,6"    { return "iPad (8th generation) (2020) (Wi-Fi)" }
    else if platform == "iPad11,7"    { return "iPad (8th generation) (2020) (Cellular)" }
        
        //iPad Air
    else if platform == "iPad4,1"     { return "iPad Air (Wi-Fi)" }
    else if platform == "iPad4,2"     { return "iPad Air (Cellular)" }
    else if platform == "iPad4,3"     { return "iPad Air (China)" }
    else if platform == "iPad5,3"     { return "iPad Air 2 (Wi-Fi)" }
    else if platform == "iPad5,4"     { return "iPad Air 2 (Cellular)" }
    else if platform == "iPad11,3"    { return "iPad Air (3rd generation) (2019) (Wi-Fi)" }
    else if platform == "iPad11,4"    { return "iPad Air (3rd generation) (2019) (Cellular)" }
    else if platform == "iPad13,1"    { return "iPad Air (4th generation) (2020) (Wi-Fi)" }
    else if platform == "iPad13,2"    { return "iPad Air (4th generation) (2020) (Cellular)" }
        
        //iPad Pro
    else if platform == "iPad6,3"     { return "iPad Pro 9.7\" (Wi-Fi)" }
    else if platform == "iPad6,4"     { return "iPad Pro 9.7\" (Cellular)" }
    else if platform == "iPad6,7"     { return "iPad Pro 12.9\" (Wi-Fi)" }
    else if platform == "iPad6,8"     { return "iPad Pro 12.9\" (Cellular)" }
    else if platform == "iPad7,1"     { return "iPad Pro 12.9\" (2nd generation) (Wi-Fi)" }
    else if platform == "iPad7,2"     { return "iPad Pro 12.9\" (2nd generation) (Cellular)" }
    else if platform == "iPad7,3"     { return "iPad Pro 10.5\" (Wi-Fi)" }
    else if platform == "iPad7,4"     { return "iPad Pro 10.5\" (Cellular)" }
    else if platform == "iPad8,1"     { return "iPad Pro 11\" (2018) (Wi-Fi)" }
    else if platform == "iPad8,2"     { return "iPad Pro 11\" (2018) (Wi-Fi, 1TB)" }
    else if platform == "iPad8,3"     { return "iPad Pro 11\" (2018) (Cellular)" }
    else if platform == "iPad8,4"     { return "iPad Pro 11\" (2018) (Cellular 1TB)" }
    else if platform == "iPad8,5"     { return "iPad Pro 12.9\" (3rd generation) (2018) (Wi-Fi)" }
    else if platform == "iPad8,6"     { return "iPad Pro 12.9\" (3rd generation) (2018) (Cellular)" }
    else if platform == "iPad8,7"     { return "iPad Pro 12.9\" (3rd generation) (2018) (Wi-Fi, 1TB)" }
    else if platform == "iPad8,8"     { return "iPad Pro 12.9\" (3rd generation) (2018) (Cellular, 1TB)" }
    else if platform == "iPad8,9"     { return "iPad Pro 11\" (2nd generation) (2020) (Wi-Fi)" }
    else if platform == "iPad8,10"    { return "iPad Pro 11\" (2nd generation) (2020) (Cellular)" }
    else if platform == "iPad8,11"    { return "iPad Pro 12.9\" (4th generation) (2020) (Wi-Fi)" }
    else if platform == "iPad8,12"    { return "iPad Pro 12.9\" (4th generation) (2020) (Cellular)" }
        
        //iPad Mini
    else if platform == "iPad2,5"     { return "iPad mini (Wi-Fi)" }
    else if platform == "iPad2,6"     { return "iPad mini (GSM)" }
    else if platform == "iPad2,7"     { return "iPad mini (GSM+CDMA)" }
    else if platform == "iPad4,4"     { return "iPad mini 2 (Wi-Fi)" }
    else if platform == "iPad4,5"     { return "iPad mini 2 (Cellular)" }
    else if platform == "iPad4,6"     { return "iPad mini 2 (China)" }
    else if platform == "iPad4,7"     { return "iPad mini 3 (Wi-Fi)" }
    else if platform == "iPad4,8"     { return "iPad mini 3 (Cellular)" }
    else if platform == "iPad4,9"     { return "iPad mini 3 (China)" }
    else if platform == "iPad5,1"     { return "iPad mini 4 (Wi-Fi)" }
    else if platform == "iPad5,2"     { return "iPad mini 4 (Cellular)" }
    else if platform == "iPad11,1"    { return "iPad mini (5th generation) (2019) (Wi-Fi)" }
    else if platform == "iPad11,2"    { return "iPad mini (5th generation) (2019) (Cellular)" }
        
        //Apple TV
    else if platform == "AppleTV2,1"  { return "Apple TV 2G" }
    else if platform == "AppleTV3,1"  { return "Apple TV 3" }
    else if platform == "AppleTV3,2"  { return "Apple TV 3 (2013)" }
    else if platform == "AppleTV5,3"  { return "Apple TV 4" }
    else if platform == "AppleTV6,2"  { return "Apple TV 4K" }
        
        //Apple Watch
    else if platform == "Watch1,1"    { return "Apple Watch (1st generation) (38mm)" }
    else if platform == "Watch1,2"    { return "Apple Watch (1st generation) (42mm)" }
    else if platform == "Watch2,6"    { return "Apple Watch Series 1 (38mm)" }
    else if platform == "Watch2,7"    { return "Apple Watch Series 1 (42mm)" }
    else if platform == "Watch2,3"    { return "Apple Watch Series 2 (38mm)" }
    else if platform == "Watch2,4"    { return "Apple Watch Series 2 (42mm)" }
    else if platform == "Watch3,1"    { return "Apple Watch Series 3 (38mm Cellular)" }
    else if platform == "Watch3,2"    { return "Apple Watch Series 3 (42mm Cellular)" }
    else if platform == "Watch3,3"    { return "Apple Watch Series 3 (38mm)" }
    else if platform == "Watch3,4"    { return "Apple Watch Series 3 (42mm)" }
    else if platform == "Watch4,1"    { return "Apple Watch Series 4 (40mm)" }
    else if platform == "Watch4,2"    { return "Apple Watch Series 4 (44mm)" }
    else if platform == "Watch4,3"    { return "Apple Watch Series 4 (40mm Cellular)" }
    else if platform == "Watch4,4"    { return "Apple Watch Series 4 (44mm Cellular)" }
    else if platform == "Watch5,1"    { return "Apple Watch Series 5 (40mm)" }
    else if platform == "Watch5,2"    { return "Apple Watch Series 5 (44mm)" }
    else if platform == "Watch5,3"    { return "Apple Watch Series 5 (40mm Cellular)" }
    else if platform == "Watch5,4"    { return "Apple Watch Series 5 (44mm Cellular)" }
    else if platform == "Watch6,1"    { return "Apple Watch Series 6 (40mm)" }
    else if platform == "Watch6,2"    { return "Apple Watch Series 6 (44mm)" }
    else if platform == "Watch6,3"    { return "Apple Watch Series 6 (40mm Cellular)" }
    else if platform == "Watch6,4"    { return "Apple Watch Series 6 (44mm Cellular)" }
    else if platform == "Watch5,9"    { return "Apple Watch SE (40mm)" }
    else if platform == "Watch5,10"   { return "Apple Watch SE (44mm)" }
    else if platform == "Watch5,11"   { return "Apple Watch SE (40mm Cellular)" }
    else if platform == "Watch5,12"   { return "Apple Watch SE (44mm Cellular)" }
        
        //Simulator
    else if platform == "i386"        { return "Simulator" }
    else if platform == "x86_64"      { return "Simulator"}
    
    return platform
}

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

print("Current device is: ", self.userDeviceName())

Цель-C

Я также добавил новые устройства в код Objective-C

Не забывай для импорта sys / sysctl.h

     #import <sys/sysctl.h>  
           
            
- (NSString *) userDeviceName {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    
    free(machine);
    
        //iPhone
        if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone (1st generation)";
        if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
        if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
        if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4 (GSM)";
        if ([platform isEqualToString:@"iPhone3,2"])    return @"iPhone 4 (GSM, 2nd revision)";
        if ([platform isEqualToString:@"iPhone3,3"])    return @"iPhone 4 (Verizon)";
        if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
        if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
        if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
        if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
        if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
        if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
        if ([platform isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
        if ([platform isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
        if ([platform isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
        if ([platform isEqualToString:@"iPhone9,1"])    return @"iPhone 7 (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone9,3"])    return @"iPhone 7 (GSM)";
        if ([platform isEqualToString:@"iPhone9,2"])    return @"iPhone 7 Plus (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone9,4"])    return @"iPhone 7 Plus (GSM)";
        if ([platform isEqualToString:@"iPhone10,1"])   return @"iPhone 8 (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone10,4"])   return @"iPhone 8 (GSM)";
        if ([platform isEqualToString:@"iPhone10,2"])   return @"iPhone 8 Plus (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone10,5"])   return @"iPhone 8 Plus (GSM)";
        if ([platform isEqualToString:@"iPhone10,3"])   return @"iPhone X (GSM+CDMA)";
        if ([platform isEqualToString:@"iPhone10,6"])   return @"iPhone X (GSM)";
        if ([platform isEqualToString:@"iPhone11,2"])   return @"iPhone XS";
        if ([platform isEqualToString:@"iPhone11,6"])   return @"iPhone XS Max";
        if ([platform isEqualToString:@"iPhone11,8"])   return @"iPhone XR";
        if ([platform isEqualToString:@"iPhone12,1"])   return @"iPhone 11";
        if ([platform isEqualToString:@"iPhone12,3"])   return @"iPhone 11 Pro";
        if ([platform isEqualToString:@"iPhone12,5"])   return @"iPhone 11 Pro Max";
        if ([platform isEqualToString:@"iPhone12,8"])   return @"iPhone SE (2nd generation)";
        if ([platform isEqualToString:@"iPhone13,1"])   return @"iPhone 12 mini";
        if ([platform isEqualToString:@"iPhone13,2"])   return @"iPhone 12";
        if ([platform isEqualToString:@"iPhone13,3"])   return @"iPhone 12 Pro";
        if ([platform isEqualToString:@"iPhone13,4"])   return @"iPhone 12 Pro Max";
        
        //iPod Touch
        if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch (1st generation)";
        if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch (2nd generation)";
        if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch (3rd generation)";
        if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch (4th generation)";
        if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch (5th generation)";
        if ([platform isEqualToString:@"iPod7,1"])      return @"iPod Touch (6th generation)";
        if ([platform isEqualToString:@"iPod9,1"])      return @"iPod Touch (7th generation) (2019)";
        
        //iPad
        if ([platform isEqualToString:@"iPad1,1"])      return @"iPad (1st generation)";
        if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (Wi-Fi)";
        if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
        if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
        if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (Wi-Fi, Mid 2012)";
        if ([platform isEqualToString:@"iPad3,1"])      return @"iPad (3rd generation) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad3,2"])      return @"iPad (3rd generation) (GSM+CDMA)";
        if ([platform isEqualToString:@"iPad3,3"])      return @"iPad (3rd generation) (GSM)";
        if ([platform isEqualToString:@"iPad3,4"])      return @"iPad (4th generation) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad3,5"])      return @"iPad (4th generation) (GSM)";
        if ([platform isEqualToString:@"iPad3,6"])      return @"iPad (4th generation) (GSM+CDMA)";
        if ([platform isEqualToString:@"iPad6,11"])     return @"iPad (5th generation) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad6,12"])     return @"iPad (5th generation) (Cellular)";
        if ([platform isEqualToString:@"iPad7,5"])      return @"iPad (6th generation) (2018) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad7,6"])      return @"iPad (6th generation) (2018) (Cellular)";
        if ([platform isEqualToString:@"iPad7,11"])     return @"iPad (7th generation) (2019) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad7,12"])     return @"iPad (7th generation) (2019) (Cellular)";
        if ([platform isEqualToString:@"iPad11,6"])     return @"iPad (8th generation) (2020) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad11,7"])     return @"iPad (8th generation) (2020) (Cellular)";
        
        //iPad Air
        if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (Wi-Fi)";
        if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
        if ([platform isEqualToString:@"iPad4,3"])      return @"iPad Air (China)";
        if ([platform isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (Wi-Fi)";
        if ([platform isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";
        if ([platform isEqualToString:@"iPad11,3"])     return @"iPad Air (3rd generation) (2019) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad11,4"])     return @"iPad Air (3rd generation) (2019) (Cellular)";
        if ([platform isEqualToString:@"iPad13,1"])     return @"iPad Air (4th generation) (2020) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad13,2"])     return @"iPad Air (4th generation) (2020) (Cellular)";
        
        //iPad Pro
        if ([platform isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7\" (Wi-Fi)";
        if ([platform isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7\" (Cellular)";
        if ([platform isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9\" (Wi-Fi)";
        if ([platform isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9\" (Cellular)";
        if ([platform isEqualToString:@"iPad7,1"])      return @"iPad Pro 12.9\" (2nd generation) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad7,2"])      return @"iPad Pro 12.9\" (2nd generation) (Cellular)";
        if ([platform isEqualToString:@"iPad7,3"])      return @"iPad Pro 10.5\" (Wi-Fi)";
        if ([platform isEqualToString:@"iPad7,4"])      return @"iPad Pro 10.5\" (Cellular)";
        if ([platform isEqualToString:@"iPad8,1"])      return @"iPad Pro 11\" (2018) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad8,2"])      return @"iPad Pro 11\" (2018) (Wi-Fi, 1TB)";
        if ([platform isEqualToString:@"iPad8,3"])      return @"iPad Pro 11\" (2018) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad8,4"])      return @"iPad Pro 11\" (2018) (Cellular)";
        if ([platform isEqualToString:@"iPad8,5"])      return @"iPad Pro 12.9\" (3rd generation) (2018) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad8,6"])      return @"iPad Pro 12.9\" (3rd generation) (2018) (Cellular)";
        if ([platform isEqualToString:@"iPad8,7"])      return @"iPad Pro 12.9\" (3rd generation) (2018) (Wi-Fi, 1TB)";
        if ([platform isEqualToString:@"iPad8,8"])      return @"iPad Pro 12.9\" (3rd generation) (2018) (Cellular, 1TB)";
        if ([platform isEqualToString:@"iPad8,9"])      return @"iPad Pro 11\" (2nd generation) (2020) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad8,10"])     return @"iPad Pro 11\" (2nd generation) (2020) (Cellular)";
        if ([platform isEqualToString:@"iPad8,11"])     return @"iPad Pro 12.9\" (4th generation) (2020) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad8,12"])     return @"iPad Pro 12.9\" (4th generation) (2020) (Cellular)";
        
        //iPad mini
        if ([platform isEqualToString:@"iPad2,5"])      return @"iPad mini (Wi-Fi)";
        if ([platform isEqualToString:@"iPad2,6"])      return @"iPad mini (GSM)";
        if ([platform isEqualToString:@"iPad2,7"])      return @"iPad mini (GSM+CDMA)";
        if ([platform isEqualToString:@"iPad4,4"])      return @"iPad mini 2 (Wi-Fi)";
        if ([platform isEqualToString:@"iPad4,5"])      return @"iPad mini 2 (Cellular)";
        if ([platform isEqualToString:@"iPad4,6"])      return @"iPad mini 2 (China)";
        if ([platform isEqualToString:@"iPad4,7"])      return @"iPad mini 3 (Wi-Fi)";
        if ([platform isEqualToString:@"iPad4,8"])      return @"iPad mini 3 (Cellular)";
        if ([platform isEqualToString:@"iPad4,9"])      return @"iPad mini 3 (China)";
        if ([platform isEqualToString:@"iPad5,1"])      return @"iPad mini 4 (Wi-Fi)";
        if ([platform isEqualToString:@"iPad5,2"])      return @"iPad mini 4 (Cellular)";
        if ([platform isEqualToString:@"iPad11,1"])     return @"iPad mini (5th generation) (2019) (Wi-Fi)";
        if ([platform isEqualToString:@"iPad11,2"])     return @"iPad mini (5th generation) (2019) (Cellular)";
        
        //Apple TV
        if ([platform isEqualToString:@"AppleTV2,1"])   return @"Apple TV 2G";
        if ([platform isEqualToString:@"AppleTV3,1"])   return @"Apple TV 3";
        if ([platform isEqualToString:@"AppleTV3,2"])   return @"Apple TV 3 (2013)";
        if ([platform isEqualToString:@"AppleTV5,3"])   return @"Apple TV 4";
        if ([platform isEqualToString:@"AppleTV6,2"])   return @"Apple TV 4K";
        
        //Apple Watch
        if ([platform isEqualToString:@"Watch1,1"])     return @"Apple Watch (1st generation) (38mm)";
        if ([platform isEqualToString:@"Watch1,2"])     return @"Apple Watch (1st generation) (42mm)";
        if ([platform isEqualToString:@"Watch2,6"])     return @"Apple Watch Series 1 (38mm)";
        if ([platform isEqualToString:@"Watch2,7"])     return @"Apple Watch Series 1 (42mm)";
        if ([platform isEqualToString:@"Watch2,3"])     return @"Apple Watch Series 2 (38mm)";
        if ([platform isEqualToString:@"Watch2,4"])     return @"Apple Watch Series 2 (42mm)";
        if ([platform isEqualToString:@"Watch3,1"])     return @"Apple Watch Series 3 (38mm Cellular)";
        if ([platform isEqualToString:@"Watch3,2"])     return @"Apple Watch Series 3 (42mm Cellular)";
        if ([platform isEqualToString:@"Watch3,3"])     return @"Apple Watch Series 3 (38mm)";
        if ([platform isEqualToString:@"Watch3,4"])     return @"Apple Watch Series 3 (42mm)";
        if ([platform isEqualToString:@"Watch4,1"])     return @"Apple Watch Series 4 (40mm)";
        if ([platform isEqualToString:@"Watch4,2"])     return @"Apple Watch Series 4 (44mm)";
        if ([platform isEqualToString:@"Watch4,3"])     return @"Apple Watch Series 4 (40mm Cellular)";
        if ([platform isEqualToString:@"Watch4,4"])     return @"Apple Watch Series 4 (44mm Cellular)";
        if ([platform isEqualToString:@"Watch5,1"])     return @"Apple Watch Series 5 (40mm)";
        if ([platform isEqualToString:@"Watch5,2"])     return @"Apple Watch Series 5 (44mm)";
        if ([platform isEqualToString:@"Watch5,3"])     return @"Apple Watch Series 5 (40mm Cellular)";
        if ([platform isEqualToString:@"Watch5,4"])     return @"Apple Watch Series 5 (44mm Cellular)";
        if ([platform isEqualToString:@"Watch6,1"])     return @"Apple Watch Series 6 (40mm)";
        if ([platform isEqualToString:@"Watch6,2"])     return @"Apple Watch Series 6 (44mm)";
        if ([platform isEqualToString:@"Watch6,3"])     return @"Apple Watch Series 6 (40mm Cellular)";
        if ([platform isEqualToString:@"Watch6,4"])     return @"Apple Watch Series 6 (44mm Cellular)";
        if ([platform isEqualToString:@"Watch5,9"])     return @"Apple Watch SE (40mm)";
        if ([platform isEqualToString:@"Watch5,10"])    return @"Apple Watch SE (44mm)";
        if ([platform isEqualToString:@"Watch5,11"])    return @"Apple Watch SE (40mm Cellular)";
        if ([platform isEqualToString:@"Watch5,12"])    return @"Apple Watch SE (44mm Cellular)";
        
        //Simulator
        if ([platform isEqualToString:@"i386"])         return @"Simulator";
        if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    
    return platform;
}

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

NSLog(@"Current device is: %@", [self userDeviceName]);

Просто чтобы уточнить ... iPhone7,2 - это 6, а iPhone8,1 - это 6S? они поменяли местами для 6 и 6S?

Magoo 06.10.2016 18:56

Да, это правильно. Вы можете проверить здесь: theiphonewiki.com/wiki/Models

D1mers0n 08.10.2016 02:15

Проверьте этот github.com/aleemrazzaq/ARCompactDeviceInfo, это последняя модель устройства, iPhone X, iPhone 8, 8 Plus и iPad 6-го поколения 2018

Aleem 04.04.2018 14:18

Есть ли способ проверить тип тренажера? :)

Victor Engel 09.12.2018 23:53

Кажется, в этом посте есть ответ на мой вопрос: stackoverflow.com/questions/33493800/…

Victor Engel 10.12.2018 00:01

Ответ в Swift 3,

struct DeviceInformation {
    // UIDevice.current.model's value is "iPhone" or "iPad",which does not include details; the following "model" is detailed, such as, iPhone7,1 is actually iPhone 6 plus
    static let model: String = {
        var size = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0,  count: Int(size))
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        return String(cString: machine)
    }()

    static let uuid = UIDevice.current.identifierForVendor?.uuidString ?? ""
    static let idForAdService = ASIdentifierManager.shared().advertisingIdentifier.uuidString

    static func diviceTypeReadableName() -> String {
        switch model {
        case "iPhone1,1":   return "iPhone 1G"
        case "iPhone1,2":   return "iPhone 3G"
        case "iPhone2,1":   return "iPhone 3GS"
        case "iPhone3,1":   return "iPhone 4"
        case "iPhone3,3":   return "iPhone 4 (Verizon)"
        case "iPhone4,1":   return "iPhone 4S"
        case "iPhone5,1":   return "iPhone 5 (GSM)"
        case "iPhone5,2":   return "iPhone 5 (GSM+CDMA)"
        case "iPhone5,3":   return "iPhone 5c (GSM)"
        case "iPhone5,4":   return "iPhone 5c (GSM+CDMA)"
        case "iPhone6,1":   return "iPhone 5s (GSM)"
        case "iPhone6,2":   return "iPhone 5s (GSM+CDMA)"
        case "iPhone7,2":   return "iPhone 6"
        case "iPhone7,1":   return "iPhone 6 Plus"
        case "iPhone8,1":   return "iPhone 6s"
        case "iPhone8,2":   return "iPhone 6s Plus"
        case "iPhone8,4":   return "iPhone SE"
        case "iPhone9,1":   return "iPhone 7"
        case "iPhone9,3":   return "iPhone 7"
        case "iPhone9,2":   return "iPhone 7 Plus"
        case "iPhone9,4":   return "iPhone 7 Plus"
        case "iPod1,1":     return "iPod Touch 1G"
        case "iPod2,1":     return "iPod Touch 2G"
        case "iPod3,1":     return "iPod Touch 3G"
        case "iPod4,1":     return "iPod Touch 4G"
        case "iPod5,1":     return "iPod Touch 5G"
        case "iPod7,1":     return "iPod Touch 6G"
        case "iPad1,1":     return "iPad 1G"
        case "iPad2,1":     return "iPad 2 (Wi-Fi)"
        case "iPad2,2":     return "iPad 2 (GSM)"
        case "iPad2,3":     return "iPad 2 (CDMA)"
        case "iPad2,4":     return "iPad 2 (Wi-Fi)"
        case "iPad2,5":     return "iPad Mini (Wi-Fi)"
        case "iPad2,6":     return "iPad Mini (GSM)"
        case "iPad2,7":     return "iPad Mini (GSM+CDMA)"
        case "iPad3,1":     return "iPad 3 (Wi-Fi)"
        case "iPad3,2":     return "iPad 3 (GSM+CDMA)"
        case "iPad3,3":     return "iPad 3 (GSM)"
        case "iPad3,4":     return "iPad 4 (Wi-Fi)"
        case "iPad3,5":     return "iPad 4 (GSM)"
        case "iPad3,6":     return "iPad 4 (GSM+CDMA)"
        case "iPad4,1":     return "iPad Air (Wi-Fi)"
        case "iPad4,2":     return "iPad Air (Cellular)"
        case "iPad4,3":     return "iPad Air (China)"
        case "iPad4,4":     return "iPad Mini 2G (Wi-Fi)"
        case "iPad4,5":     return "iPad Mini 2G (Cellular)"
        case "iPad4,6":     return "iPad Mini 2G (China)"
        case "iPad4,7":     return "iPad Mini 3 (Wi-Fi)"
        case "iPad4,8":     return "iPad Mini 3 (Cellular)"
        case "iPad4,9":     return "iPad Mini 3 (China)"
        case "iPad5,1":     return "iPad Mini 4 (Wi-Fi)"
        case "iPad5,2":     return "iPad Mini 4 (Cellular)"
        case "iPad5,3":     return "iPad Air 2 (Wi-Fi)"
        case "iPad5,4":     return "iPad Air 2 (Cellular)"
        case "iPad6,3":     return "iPad Pro 9.7' (Wi-Fi)"
        case "iPad6,4":     return "iPad Pro 9.7' (Cellular)"
        case "iPad6,7":     return "iPad Pro 12.9' (Wi-Fi)"
        case "iPad6,8":     return "iPad Pro 12.9' (Cellular)"
        case "AppleTV2,1":  return "Apple TV 2G"
        case "AppleTV3,1":  return "Apple TV 3"
        case "AppleTV3,2":  return "Apple TV 3 (2013)"
        case "AppleTV5,3":  return "Apple TV 4"
        case "Watch1,1":    return "Apple Watch Series 1 (38mm, S1)"
        case "Watch1,2":    return "Apple Watch Series 1 (42mm, S1)"
        case "Watch2,6":    return "Apple Watch Series 1 (38mm, S1P)"
        case "Watch2,7":    return "Apple Watch Series 1 (42mm, S1P)"
        case "Watch2,3":    return "Apple Watch Series 2 (38mm, S2)"
        case "Watch2,4":    return "Apple Watch Series 2 (42mm, S2)"
        case "i386":        return "Simulator"
        case "x86_64":      return "Simulator"

        default:
            return ""
        }
    }
}

Чтобы идентифицировать iPhone 4S, просто проверьте следующее:

var isIphone4S: Bool {

    let width = UIScreen.main.bounds.size.width
    let height = UIScreen.main.bounds.size.height
    let proportions = width > height ? width / height : height / width

    return proportions == 1.5 && UIDevice.current.model == "iPhone"
}

Обновить строку платформы.

// Created from this thread: https://gist.github.com/Jaybles/1323251

// Apple TV
if ([platform isEqualToString:@"AppleTV2,1"])   return @"Apple TV 2G";
if ([platform isEqualToString:@"AppleTV3,1"])   return @"Apple TV 3G";
if ([platform isEqualToString:@"AppleTV3,2"])   return @"Apple TV 3G";
if ([platform isEqualToString:@"AppleTV5,3"])   return @"Apple TV 4G";

// Apple Watch
if ([platform isEqualToString:@"Watch1,1"])     return @"Apple Watch";
if ([platform isEqualToString:@"Watch1,2"])     return @"Apple Watch";

// iPhone
if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 2G";
if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4 (GSM)";
if ([platform isEqualToString:@"iPhone3,2"])    return @"iPhone 4 (GSM/2012)";
if ([platform isEqualToString:@"iPhone3,3"])    return @"iPhone 4 (CDMA)";
if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (Global)";
if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (Global)";
if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (Global)";
if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
if ([platform isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
if ([platform isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
if ([platform isEqualToString:@"iPhone9,1"])    return @"iPhone 7 (Global)";
if ([platform isEqualToString:@"iPhone9,3"])    return @"iPhone 7 (GSM)";
if ([platform isEqualToString:@"iPhone9,2"])    return @"iPhone 7 Plus (Global)";
if ([platform isEqualToString:@"iPhone9,4"])    return @"iPhone 7 Plus (GSM)";

// iPad
if ([platform isEqualToString:@"iPad1,1"])      return @"iPad 1";
if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (Mid 2012)";
if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (CDMA)";
if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (Global)";

// iPad Air
if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
if ([platform isEqualToString:@"iPad4,3"])      return @"iPad Air (China)";
if ([platform isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (WiFi)";
if ([platform isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";

// iPad Mini
if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (Global)";
if ([platform isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
if ([platform isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
if ([platform isEqualToString:@"iPad4,6"])      return @"iPad Mini 2 (China)";
if ([platform isEqualToString:@"iPad4,7"])      return @"iPad Mini 3 (WiFi)";
if ([platform isEqualToString:@"iPad4,8"])      return @"iPad Mini 3 (Cellular)";
if ([platform isEqualToString:@"iPad4,9"])      return @"iPad Mini 3 (China)";
if ([platform isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
if ([platform isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (Cellular)";

// iPad Pro
if ([platform isEqualToString:@"iPad6,3"])      return @"iPad Pro (9.7 inch/WiFi)";
if ([platform isEqualToString:@"iPad6,4"])      return @"iPad Pro (9.7 inch/Cellular)";
if ([platform isEqualToString:@"iPad6,7"])      return @"iPad Pro (12.9 inch/WiFi)";
if ([platform isEqualToString:@"iPad6,8"])      return @"iPad Pro (12.9 inch/Cellular)";

// iPod
if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";
if ([platform isEqualToString:@"iPod7,1"])      return @"iPod Touch 6G";

// Simulator
if ([platform isEqualToString:@"i386"])         return @"Simulator";
if ([platform isEqualToString:@"x86_64"])       return @"Simulator";

Для простого сравнения мне всегда нравится макрос:

#define IS_IPOD [[UIDevice currentDevice].model containsString:@"iPod"]
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

Это просто и удобно.

Я создал расширение, которое позволяет вам иметь 3 уровня идентификации:

  1. тип устройства
  2. тип iPhone / iPad в дюймах
  3. модель устройства

Он обновляется с последними устройствами iOS

UIDeviceDetector

Другие вопросы по теме