versiones descargar apple ios objective-c iphone ipad

descargar - ¿Cómo obtener la marca y modelo del dispositivo en iOS?



iphone (16)

Me preguntaba si es posible determinar qué tipo de iPhone (por ejemplo) es el dispositivo actual. Sé que es posible obtener el modelo a través
NSString *deviceType = [[UIDevice currentDevice] model];
que solo devolverá si tengo un "iPhone" o un "iPod", PERO me preguntaba si es posible detectar / saber si tengo un iPhone 3GS vs. iPhone 4 vs. un iPhone 4S (en realidad, todo lo que realmente quiero hacer es determinar si tengo un 3G o no, porque estoy haciendo cosas bastante intensivas en gráficos) .

Así que sí, házmelo saber, gracias!


Nombre del dispositivo y nombres de máquinas, basados ​​en el hardware del dispositivo real iOS

Mi solución a este problema es básicamente la apariencia relacionada con la respuesta de @NicolasMiari en este hilo. La clase de utilidad separada tiene un conjunto predefinido de nombres de dispositivos y máquinas y luego, dependiendo del nombre real de la máquina, recupere el nombre del dispositivo.

Nota: esta respuesta y el proyecto GitHub se ha actualizado para identificar los últimos iPhones actuales (iPhone 8, 8+, X) a partir de octubre de 2017. Y esto también funciona en iOS11 . Por favor visite el repositorio de GitHub y vea, y dame un comentario si algo está mal.

/* * Retrieves back the device name or if not the machine name. */ + (NSString*)deviceModelName { struct utsname systemInfo; uname(&systemInfo); NSString *machineName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; //MARK: More official list is at //http://theiphonewiki.com/wiki/Models //MARK: You may just return machineName. Following is for convenience NSDictionary *commonNamesDictionary = @{ @"i386": @"i386 Simulator", @"x86_64": @"x86_64 Simulator", @"iPhone1,1": @"iPhone", @"iPhone1,2": @"iPhone 3G", @"iPhone2,1": @"iPhone 3GS", @"iPhone3,1": @"iPhone 4", @"iPhone3,2": @"iPhone 4(Rev A)", @"iPhone3,3": @"iPhone 4(CDMA)", @"iPhone4,1": @"iPhone 4S", @"iPhone5,1": @"iPhone 5(GSM)", @"iPhone5,2": @"iPhone 5(GSM+CDMA)", @"iPhone5,3": @"iPhone 5c(GSM)", @"iPhone5,4": @"iPhone 5c(GSM+CDMA)", @"iPhone6,1": @"iPhone 5s(GSM)", @"iPhone6,2": @"iPhone 5s(GSM+CDMA)", @"iPhone7,1": @"iPhone 6+(GSM+CDMA)", @"iPhone7,2": @"iPhone 6(GSM+CDMA)", @"iPhone8,1": @"iPhone 6S(GSM+CDMA)", @"iPhone8,2": @"iPhone 6S+(GSM+CDMA)", @"iPhone8,4": @"iPhone SE(GSM+CDMA)", @"iPhone9,1": @"iPhone 7(GSM+CDMA)", @"iPhone9,2": @"iPhone 7+(GSM+CDMA)", @"iPhone9,3": @"iPhone 7(GSM+CDMA)", @"iPhone9,4": @"iPhone 7+(GSM+CDMA)", @"iPad1,1": @"iPad", @"iPad2,1": @"iPad 2(WiFi)", @"iPad2,2": @"iPad 2(GSM)", @"iPad2,3": @"iPad 2(CDMA)", @"iPad2,4": @"iPad 2(WiFi Rev A)", @"iPad2,5": @"iPad Mini 1G (WiFi)", @"iPad2,6": @"iPad Mini 1G (GSM)", @"iPad2,7": @"iPad Mini 1G (GSM+CDMA)", @"iPad3,1": @"iPad 3(WiFi)", @"iPad3,2": @"iPad 3(GSM+CDMA)", @"iPad3,3": @"iPad 3(GSM)", @"iPad3,4": @"iPad 4(WiFi)", @"iPad3,5": @"iPad 4(GSM)", @"iPad3,6": @"iPad 4(GSM+CDMA)", @"iPad4,1": @"iPad Air(WiFi)", @"iPad4,2": @"iPad Air(GSM)", @"iPad4,3": @"iPad Air(GSM+CDMA)", @"iPad5,3": @"iPad Air 2 (WiFi)", @"iPad5,4": @"iPad Air 2 (GSM+CDMA)", @"iPad4,4": @"iPad Mini 2G (WiFi)", @"iPad4,5": @"iPad Mini 2G (GSM)", @"iPad4,6": @"iPad Mini 2G (GSM+CDMA)", @"iPad4,7": @"iPad Mini 3G (WiFi)", @"iPad4,8": @"iPad Mini 3G (GSM)", @"iPad4,9": @"iPad Mini 3G (GSM+CDMA)", @"iPod1,1": @"iPod 1st Gen", @"iPod2,1": @"iPod 2nd Gen", @"iPod3,1": @"iPod 3rd Gen", @"iPod4,1": @"iPod 4th Gen", @"iPod5,1": @"iPod 5th Gen", @"iPod7,1": @"iPod 6th Gen", }; NSString *deviceName = commonNamesDictionary[machineName]; if (deviceName == nil) { deviceName = machineName; } return deviceName; }

He agregado esta implementación y algunos otros métodos de utilidad convenientes en una clase y los puse en este repositorio de GitHub . Y también puede encontrar la lista actualizada de información del dispositivo en esta página de Wiki .

Por favor visítalo y consíguelo.

Actualizar:

Es posible que necesite importar el marco del sistema,

#import <sys/utsname.h>


Una categoría para alejarse de la descripción de NSString

En general, es conveniente evitar comparaciones de cadenas arbitrarias en todo el código. Es mejor actualizar las cadenas en un lugar y ocultar la cadena mágica de tu aplicación. Proporciono una categoría en UIDevice para ese propósito.

Para mis necesidades específicas, necesito saber qué dispositivo estoy usando sin la necesidad de conocer detalles específicos sobre la capacidad de red que se pueden recuperar fácilmente de otras maneras. Por lo tanto, encontrará una enum grano más grueso que la creciente lista de dispositivos.

La actualización es una cuestión de agregar el dispositivo a la enumeración y la tabla de búsqueda.

UIDevice + NTNUExtensions.h

typedef NS_ENUM(NSUInteger, NTNUDeviceType) { DeviceAppleUnknown, DeviceAppleSimulator, DeviceAppleiPhone, DeviceAppleiPhone3G, DeviceAppleiPhone3GS, DeviceAppleiPhone4, DeviceAppleiPhone4S, DeviceAppleiPhone5, DeviceAppleiPhone5C, DeviceAppleiPhone5S, DeviceAppleiPhone6, DeviceAppleiPhone6_Plus, DeviceAppleiPhone6S, DeviceAppleiPhone6S_Plus, DeviceAppleiPhoneSE, DeviceAppleiPhone7, DeviceAppleiPhone7_Plus, DeviceAppleiPodTouch, DeviceAppleiPodTouch2G, DeviceAppleiPodTouch3G, DeviceAppleiPodTouch4G, DeviceAppleiPad, DeviceAppleiPad2, DeviceAppleiPad3G, DeviceAppleiPad4G, DeviceAppleiPad5G_Air, DeviceAppleiPadMini, DeviceAppleiPadMini2G, DeviceAppleiPadPro12, DeviceAppleiPadPro9 }; @interface UIDevice (NTNUExtensions) - (NSString *)ntnu_deviceDescription; - (NTNUDeviceType)ntnu_deviceType; @end

UIDevice + NTNUExtensions.m

#import <sys/utsname.h> #import "UIDevice+NTNUExtensions.h" @implementation UIDevice (NTNUExtensions) - (NSString *)ntnu_deviceDescription { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } - (NTNUDeviceType)ntnu_deviceType { NSNumber *deviceType = [[self ntnu_deviceTypeLookupTable] objectForKey:[self ntnu_deviceDescription]]; return [deviceType unsignedIntegerValue]; } - (NSDictionary *)ntnu_deviceTypeLookupTable { return @{ @"i386": @(DeviceAppleSimulator), @"x86_64": @(DeviceAppleSimulator), @"iPod1,1": @(DeviceAppleiPodTouch), @"iPod2,1": @(DeviceAppleiPodTouch2G), @"iPod3,1": @(DeviceAppleiPodTouch3G), @"iPod4,1": @(DeviceAppleiPodTouch4G), @"iPhone1,1": @(DeviceAppleiPhone), @"iPhone1,2": @(DeviceAppleiPhone3G), @"iPhone2,1": @(DeviceAppleiPhone3GS), @"iPhone3,1": @(DeviceAppleiPhone4), @"iPhone3,3": @(DeviceAppleiPhone4), @"iPhone4,1": @(DeviceAppleiPhone4S), @"iPhone5,1": @(DeviceAppleiPhone5), @"iPhone5,2": @(DeviceAppleiPhone5), @"iPhone5,3": @(DeviceAppleiPhone5C), @"iPhone5,4": @(DeviceAppleiPhone5C), @"iPhone6,1": @(DeviceAppleiPhone5S), @"iPhone6,2": @(DeviceAppleiPhone5S), @"iPhone7,1": @(DeviceAppleiPhone6_Plus), @"iPhone7,2": @(DeviceAppleiPhone6), @"iPhone8,1" :@(DeviceAppleiPhone6S), @"iPhone8,2" :@(DeviceAppleiPhone6S_Plus), @"iPhone8,4" :@(DeviceAppleiPhoneSE), @"iPhone9,1" :@(DeviceAppleiPhone7), @"iPhone9,3" :@(DeviceAppleiPhone7), @"iPhone9,2" :@(DeviceAppleiPhone7_Plus), @"iPhone9,4" :@(DeviceAppleiPhone7_Plus), @"iPad1,1": @(DeviceAppleiPad), @"iPad2,1": @(DeviceAppleiPad2), @"iPad3,1": @(DeviceAppleiPad3G), @"iPad3,4": @(DeviceAppleiPad4G), @"iPad2,5": @(DeviceAppleiPadMini), @"iPad4,1": @(DeviceAppleiPad5G_Air), @"iPad4,2": @(DeviceAppleiPad5G_Air), @"iPad4,4": @(DeviceAppleiPadMini2G), @"iPad4,5": @(DeviceAppleiPadMini2G), @"iPad4,7":@(DeviceAppleiPadMini), @"iPad6,7":@(DeviceAppleiPadPro12), @"iPad6,8":@(DeviceAppleiPadPro12), @"iPad6,3":@(DeviceAppleiPadPro9), @"iPad6,4":@(DeviceAppleiPadPro9) }; } @end


Abajo está el código para eso (el código puede no contener toda la cadena del dispositivo, estoy con otros tipos que están manteniendo el mismo código en GitHub, así que por favor tome el último código de allí )

Objective-C : GitHub/DeviceUtil

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


Ampliando la respuesta anterior de OhhMee, agregué algunos seguros contra fallas para admitir futuros dispositivos que aún no están incluidos en la lista:

#import <sys/utsname.h> #import "MyClass.h" @implementation MyClass { //(your private ivars) } - (NSString*) deviceName { struct utsname systemInfo; uname(&systemInfo); NSString* code = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; static NSDictionary* deviceNamesByCode = nil; if (!deviceNamesByCode) { deviceNamesByCode = @{@"i386" : @"Simulator", @"x86_64" : @"Simulator", @"iPod1,1" : @"iPod Touch", // (Original) @"iPod2,1" : @"iPod Touch", // (Second Generation) @"iPod3,1" : @"iPod Touch", // (Third Generation) @"iPod4,1" : @"iPod Touch", // (Fourth Generation) @"iPod7,1" : @"iPod Touch", // (6th Generation) @"iPhone1,1" : @"iPhone", // (Original) @"iPhone1,2" : @"iPhone", // (3G) @"iPhone2,1" : @"iPhone", // (3GS) @"iPad1,1" : @"iPad", // (Original) @"iPad2,1" : @"iPad 2", // @"iPad3,1" : @"iPad", // (3rd Generation) @"iPhone3,1" : @"iPhone 4", // (GSM) @"iPhone3,3" : @"iPhone 4", // (CDMA/Verizon/Sprint) @"iPhone4,1" : @"iPhone 4S", // @"iPhone5,1" : @"iPhone 5", // (model A1428, AT&T/Canada) @"iPhone5,2" : @"iPhone 5", // (model A1429, everything else) @"iPad3,4" : @"iPad", // (4th Generation) @"iPad2,5" : @"iPad Mini", // (Original) @"iPhone5,3" : @"iPhone 5c", // (model A1456, A1532 | GSM) @"iPhone5,4" : @"iPhone 5c", // (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" : @"iPhone 5s", // (model A1433, A1533 | GSM) @"iPhone6,2" : @"iPhone 5s", // (model A1457, A1518, A1528 (China), A1530 | Global) @"iPhone7,1" : @"iPhone 6 Plus", // @"iPhone7,2" : @"iPhone 6", // @"iPhone8,1" : @"iPhone 6S", // @"iPhone8,2" : @"iPhone 6S Plus", // @"iPhone8,4" : @"iPhone SE", // @"iPhone9,1" : @"iPhone 7", // @"iPhone9,3" : @"iPhone 7", // @"iPhone9,2" : @"iPhone 7 Plus", // @"iPhone9,4" : @"iPhone 7 Plus", // @"iPhone10,1": @"iPhone 8", // CDMA @"iPhone10,4": @"iPhone 8", // GSM @"iPhone10,2": @"iPhone 8 Plus", // CDMA @"iPhone10,5": @"iPhone 8 Plus", // GSM @"iPhone10,3": @"iPhone X", // CDMA @"iPhone10,6": @"iPhone X", // GSM @"iPhone11,2": @"iPhone XS", // @"iPhone11,4": @"iPhone XS Max", // @"iPhone11,6": @"iPhone XS Max", // China @"iPhone11,8": @"iPhone XR", // @"iPad4,1" : @"iPad Air", // 5th Generation iPad (iPad Air) - Wifi @"iPad4,2" : @"iPad Air", // 5th Generation iPad (iPad Air) - Cellular @"iPad4,4" : @"iPad Mini", // (2nd Generation iPad Mini - Wifi) @"iPad4,5" : @"iPad Mini", // (2nd Generation iPad Mini - Cellular) @"iPad4,7" : @"iPad Mini", // (3rd Generation iPad Mini - Wifi (model A1599)) @"iPad6,7" : @"iPad Pro (12.9/")", // iPad Pro 12.9 inches - (model A1584) @"iPad6,8" : @"iPad Pro (12.9/")", // iPad Pro 12.9 inches - (model A1652) @"iPad6,3" : @"iPad Pro (9.7/")", // iPad Pro 9.7 inches - (model A1673) @"iPad6,4" : @"iPad Pro (9.7/")" // iPad Pro 9.7 inches - (models A1674 and A1675) }; } NSString* deviceName = [deviceNamesByCode objectForKey:code]; if (!deviceName) { // Not found on database. At least guess main device type from string contents: if ([code rangeOfString:@"iPod"].location != NSNotFound) { deviceName = @"iPod Touch"; } else if([code rangeOfString:@"iPad"].location != NSNotFound) { deviceName = @"iPad"; } else if([code rangeOfString:@"iPhone"].location != NSNotFound){ deviceName = @"iPhone"; } else { deviceName = @"Unknown"; } } return deviceName; } // (rest of class implementation omitted) @end

También omití la información detallada (p. Ej., "Modelo A1507, A1516, A1526 (China), A1529 | Global") y la coloqué en los comentarios, en caso de que quiera usarla como una cadena que no afecte a los usuarios.

Editar: Esta respuesta proporciona una implementación similar utilizando Swift 2.

Edición 2: Acabo de agregar los modelos de iPad Pro (ambos tamaños). Para futuras referencias, los números de modelo / etc. Se puede encontrar en el iPhone Wiki .

Edición 3: Agregar soporte para iPhone XS, iPhone XS Max y iPhone XR.


He creado el archivo plist para ayudarlo a obtener el nombre completo de cada dispositivo (código fuente justo al final de mi respuesta)

Basado en la respuesta de OhhMee , puedes usarlo así:

Swift 4.0

static func deviceName() -> String { var systemInfo = utsname() uname(&systemInfo) guard let iOSDeviceModelsPath = Bundle.main.path(forResource: "iOSDeviceModelMapping", ofType: "plist") else { return "" } guard let iOSDevices = NSDictionary(contentsOfFile: iOSDeviceModelsPath) else { return "" } let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return iOSDevices.value(forKey: identifier) as! String }

No olvide agregar #import <sys/utsname.h> en su Encabezado Bridging.

C objetivo

#import <sys/utsname.h> NSString *machineName() { struct utsname systemInfo; uname(&systemInfo); NSString *iOSDeviceModelsPath = [[NSBundle mainBundle] pathForResource:@"iOSDeviceModelMapping" ofType:@"plist"]; NSDictionary *iOSDevices = [NSDictionary dictionaryWithContentsOfFile:iOSDeviceModelsPath]; NSString* deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; return [iOSDevices valueForKey:deviceModel]; }

El archivo plist:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>x86_64</key> <string>Simulator</string> <key>i386</key> <string>Simulator</string> <key>iPod1,1</key> <string>iPod Touch 1st Gen</string> <key>iPod2,1</key> <string>iPod Touch 2nd Gen</string> <key>iPod3,1</key> <string>iPod Touch 3rd Gen</string> <key>iPod4,1</key> <string>iPod Touch 4th Gen</string> <key>iPod5,1</key> <string>iPod Touch 5th Gen</string> <key>iPod7,1</key> <string>iPod Touch 6th Gen</string> <key>iPhone1,1</key> <string>iPhone</string> <key>iPhone1,2</key> <string>iPhone 3G</string> <key>iPhone2,1</key> <string>iPhone 3GS</string> <key>iPhone3,1</key> <string>iPhone 4</string> <key>iPhone3,2</key> <string>iPhone 4</string> <key>iPhone3,3</key> <string>iPhone 4</string> <key>iPhone4,1</key> <string>iPhone 4S</string> <key>iPhone5,1</key> <string>iPhone 5 model A1428</string> <key>iPhone5,2</key> <string>iPhone 5 model A1429</string> <key>iPhone5,3</key> <string>iPhone 5C</string> <key>iPhone5,4</key> <string>iPhone 5C</string> <key>iPhone6,1</key> <string>iPhone 5S</string> <key>iPhone6,2</key> <string>iPhone 5S</string> <key>iPhone7,2</key> <string>iPhone 6</string> <key>iPhone7,1</key> <string>iPhone 6 Plus</string> <key>iPhone8,1</key> <string>iPhone 6S</string> <key>iPhone8,2</key> <string>iPhone 6S Plus</string> <key>iPhone8,4</key> <string>iPhone SE</string> <key>iPhone9,1</key> <string>iPhone 7</string> <key>iPhone9,2</key> <string>iPhone 7 Plus</string> <key>iPhone9,3</key> <string>iPhone 7</string> <key>iPhone9,4</key> <string>iPhone 7 Plus</string> <key>iPhone10,1</key> <string>iPhone 8</string> <key>iPhone10,4</key> <string>iPhone 8</string> <key>iPhone10,2</key> <string>iPhone 8 Plus</string> <key>iPhone10,5</key> <string>iPhone 8 Plus</string> <key>iPhone10,3</key> <string>iPhone X</string> <key>iPhone10,6</key> <string>iPhone X</string> <key>iPhone11,2</key> <string>iPhone XS</string> <key>iPhone11,4</key> <string>iPhone XS Max</string> <key>iPhone11,6</key> <string>iPhone XS Max</string> <key>iPhone11,8</key> <string>iPhone XR</string> <key>iPad1,1</key> <string>iPad</string> <key>iPad2,1</key> <string>iPad 2</string> <key>iPad2,2</key> <string>iPad 2</string> <key>iPad2,3</key> <string>iPad 2</string> <key>iPad2,4</key> <string>iPad 2</string> <key>iPad3,1</key> <string>iPad 3rd Gen</string> <key>iPad3,2</key> <string>iPad 3rd Gen</string> <key>iPad3,3</key> <string>iPad 3rd Gen</string> <key>iPad3,4</key> <string>iPad 4th Gen</string> <key>iPad3,5</key> <string>iPad 4th Gen</string> <key>iPad3,6</key> <string>iPad 4th Gen</string> <key>iPad4,1</key> <string>iPad Air</string> <key>iPad4,2</key> <string>iPad Air</string> <key>iPad4,3</key> <string>iPad Air</string> <key>iPad2,5</key> <string>iPad Mini 1st Gen</string> <key>iPad2,6</key> <string>iPad Mini 1st Gen</string> <key>iPad2,7</key> <string>iPad Mini 1st Gen</string> <key>iPad4,4</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,5</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,6</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,7</key> <string>iPad Mini 3rd Gen</string> <key>iPad4,8</key> <string>iPad Mini 3rd Gen</string> <key>iPad4,9</key> <string>iPad Mini 3rd Gen</string> <key>iPad5,1</key> <string>iPad Mini 4</string> <key>iPad5,2</key> <string>iPad Mini 4</string> <key>iPad5,3</key> <string>iPad Air 2</string> <key>iPad5,4</key> <string>iPad Air 2</string> <key>iPad6,3</key> <string>iPad Pro 9.7 inch</string> <key>iPad6,4</key> <string>iPad Pro 9.7 inch</string> <key>iPad6,7</key> <string>iPad Pro 12.9 inch</string> <key>iPad6,8</key> <string>iPad Pro 12.9 inch</string> <key>iPad7,1</key> <string>iPad Pro 12.9 inch 2nd Gen</string> <key>iPad7,2</key> <string>iPad Pro 12.9 inch 2nd Gen</string> <key>iPad7,3</key> <string>iPad Pro 10.5 inch</string> <key>iPad7,4</key> <string>iPad Pro 10.5 inch</string> </dict> </plist>


He optimizado la implementación de NicolasMiari, y he agregado Simulator , aquí:

+ (NSString*)deviceName { static NSDictionary* deviceNamesByCode = nil; static NSString* deviceName = nil; if (deviceName) { return deviceName; } deviceNamesByCode = @{ @"i386" :@"Simulator", @"iPod1,1" :@"iPod Touch", // (Original) @"iPod2,1" :@"iPod Touch", // (Second Generation) @"iPod3,1" :@"iPod Touch", // (Third Generation) @"iPod4,1" :@"iPod Touch", // (Fourth Generation) @"iPhone1,1" :@"iPhone", // (Original) @"iPhone1,2" :@"iPhone", // (3G) @"iPhone2,1" :@"iPhone", // (3GS) @"iPad1,1" :@"iPad", // (Original) @"iPad2,1" :@"iPad 2", // @"iPad3,1" :@"iPad", // (3rd Generation) @"iPhone3,1" :@"iPhone 4", // @"iPhone4,1" :@"iPhone 4S", // @"iPhone5,1" :@"iPhone 5", // (model A1428, AT&T/Canada) @"iPhone5,2" :@"iPhone 5", // (model A1429, everything else) @"iPad3,4" :@"iPad", // (4th Generation) @"iPad2,5" :@"iPad Mini", // (Original) @"iPhone5,3" :@"iPhone 5c", // (model A1456, A1532 | GSM) @"iPhone5,4" :@"iPhone 5c", // (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" :@"iPhone 5s", // (model A1433, A1533 | GSM) @"iPhone6,2" :@"iPhone 5s", // (model A1457, A1518, A1528 (China), A1530 | Global) @"iPad4,1" :@"iPad Air", // 5th Generation iPad (iPad Air) - Wifi @"iPad4,2" :@"iPad Air", // 5th Generation iPad (iPad Air) - Cellular @"iPad4,4" :@"iPad Mini", // (2nd Generation iPad Mini - Wifi) @"iPad4,5" :@"iPad Mini" // (2nd Generation iPad Mini - Cellular) }; struct utsname systemInfo; uname(&systemInfo); NSString* code = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; deviceName = [deviceNamesByCode objectForKey:code]; if (!deviceName) { // Not found in database. At least guess main device type from string contents: if ([code rangeOfString:@"iPod"].location != NSNotFound) { deviceName = @"iPod Touch"; } else if([code rangeOfString:@"iPad"].location != NSNotFound) { deviceName = @"iPad"; } else if([code rangeOfString:@"iPhone"].location != NSNotFound){ deviceName = @"iPhone"; } else { deviceName = @"Simulator"; } } return deviceName; }

`` `


O intente esta biblioteca: http://github.com/erica/uidevice-extension/ (por Erica Sadun). (La biblioteca tiene 7-8 años, y por lo tanto es obsoleta)

(Código de muestra):

[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"

O puedes usar este método:

Puede obtener el número de modelo del dispositivo usando uname desde sys / utsname.h. Por ejemplo:

C objetivo

#import <sys/utsname.h> // import it in your header or implementation file. NSString* deviceName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; }

Swift 3

extension UIDevice { var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return identifier } } print(UIDevice.current.modelName)

El resultado debe ser:

//Simultor @"i386" on 32-bit Simulator @"x86_64" on 64-bit Simulator //iPhone @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPhone3,1" on iPhone 4 (GSM) @"iPhone3,3" on iPhone 4 (CDMA/Verizon/Sprint) @"iPhone4,1" on iPhone 4S @"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada) @"iPhone5,2" on iPhone 5 (model A1429, everything else) @"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM) @"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM) @"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global) @"iPhone7,1" on iPhone 6 Plus @"iPhone7,2" on iPhone 6 @"iPhone8,1" on iPhone 6S @"iPhone8,2" on iPhone 6S Plus @"iPhone8,4" on iPhone SE @"iPhone9,1" on iPhone 7 (CDMA) @"iPhone9,3" on iPhone 7 (GSM) @"iPhone9,2" on iPhone 7 Plus (CDMA) @"iPhone9,4" on iPhone 7 Plus (GSM) @"iPhone10,1" on iPhone 8 (CDMA) @"iPhone10,4" on iPhone 8 (GSM) @"iPhone10,2" on iPhone 8 Plus (CDMA) @"iPhone10,5" on iPhone 8 Plus (GSM) @"iPhone10,3" on iPhone X (CDMA) @"iPhone10,6" on iPhone X (GSM) @"iPhone11,2" on iPhone XS @"iPhone11,4" on iPhone XS Max @"iPhone11,6" on iPhone XS Max China @"iPhone11,8" on iPhone XR //iPad 1 @"iPad1,1" on iPad - Wifi (model A1219) @"iPad1,1" on iPad - Wifi + Cellular (model A1337) //iPad 2 @"iPad2,1" - Wifi (model A1395) @"iPad2,2" - GSM (model A1396) @"iPad2,3" - 3G (model A1397) @"iPad2,4" - Wifi (model A1395) // iPad Mini @"iPad2,5" - Wifi (model A1432) @"iPad2,6" - Wifi + Cellular (model A1454) @"iPad2,7" - Wifi + Cellular (model A1455) //iPad 3 @"iPad3,1" - Wifi (model A1416) @"iPad3,2" - Wifi + Cellular (model A1403) @"iPad3,3" - Wifi + Cellular (model A1430) //iPad 4 @"iPad3,4" - Wifi (model A1458) @"iPad3,5" - Wifi + Cellular (model A1459) @"iPad3,6" - Wifi + Cellular (model A1460) //iPad AIR @"iPad4,1" - Wifi (model A1474) @"iPad4,2" - Wifi + Cellular (model A1475) @"iPad4,3" - Wifi + Cellular (model A1476) // iPad Mini 2 @"iPad4,4" - Wifi (model A1489) @"iPad4,5" - Wifi + Cellular (model A1490) @"iPad4,6" - Wifi + Cellular (model A1491) // iPad Mini 3 @"iPad4,7" - Wifi (model A1599) @"iPad4,8" - Wifi + Cellular (model A1600) @"iPad4,9" - Wifi + Cellular (model A1601) // iPad Mini 4 @"iPad5,1" - Wifi (model A1538) @"iPad5,2" - Wifi + Cellular (model A1550) //iPad AIR 2 @"iPad5,3" - Wifi (model A1566) @"iPad5,4" - Wifi + Cellular (model A1567) // iPad PRO 9.7" @"iPad6,3" - Wifi (model A1673) @"iPad6,4" - Wifi + Cellular (model A1674) @"iPad6,4" - Wifi + Cellular (model A1675) //iPad PRO 12.9" @"iPad6,7" - Wifi (model A1584) @"iPad6,8" - Wifi + Cellular (model A1652) //iPad (5th generation) @"iPad6,11" - Wifi (model A1822) @"iPad6,12" - Wifi + Cellular (model A1823) //iPad PRO 12.9" (2nd Gen) @"iPad7,1" - Wifi (model A1670) @"iPad7,2" - Wifi + Cellular (model A1671) @"iPad7,2" - Wifi + Cellular (model A1821) //iPad PRO 10.5" @"iPad7,3" - Wifi (model A1701) @"iPad7,4" - Wifi + Cellular (model A1709) //iPod Touch @"iPod1,1" on iPod Touch @"iPod2,1" on iPod Touch Second Generation @"iPod3,1" on iPod Touch Third Generation @"iPod4,1" on iPod Touch Fourth Generation @"iPod7,1" on iPod Touch 6th Generation // Apple Watch @"Watch1,1" on Apple Watch 38mm case @"Watch1,2" on Apple Watch 38mm case @"Watch2,6" on Apple Watch Series 1 38mm case @"Watch2,7" on Apple Watch Series 1 42mm case @"Watch2,3" on Apple Watch Series 2 38mm case @"Watch2,4" on Apple Watch Series 2 42mm case @"Watch3,1" on Apple Watch Series 3 38mm case (GPS+Cellular) @"Watch3,2" on Apple Watch Series 3 42mm case (GPS+Cellular) @"Watch3,3" on Apple Watch Series 3 38mm case (GPS) @"Watch3,4" on Apple Watch Series 3 42mm case (GPS) @"Watch4,1" on Apple Watch Series 4 40mm case (GPS) @"Watch4,2" on Apple Watch Series 4 44mm case (GPS) @"Watch4,3" on Apple Watch Series 4 40mm case (GPS+Cellular) @"Watch4,4" on Apple Watch Series 4 44mm case (GPS+Cellular)


[[UIDevice currentDevice] model] solo devuelve iPhone o iPod , no obtiene los números del modelo que le permitirían diferenciar entre diferentes generaciones de dispositivos.

Código de este método:

#include <sys/sysctl.h> ... + (NSString *)getModel { 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; }

Y llame al método [self getModel] cuando necesite el modelo y obtendrá, por ejemplo, "iPhone5,1" para el iPhone 5 ridículamente delgado y veloz.

Una buena práctica es crear una clase llamada Utils.h/Utils.m y poner métodos como getModel allí para que pueda obtener esta información desde cualquier lugar en su aplicación simplemente importando la clase e invocando [Utils getModel];


A continuación la función funciona perfectamente en iOS7 o una versión posterior en Swift

func DeviceName()-> String { var myDeviceName : String = String() var systemInfo = [UInt8](count: sizeof(utsname), repeatedValue: 0) let model = systemInfo.withUnsafeMutableBufferPointer { (inout body: UnsafeMutableBufferPointer<UInt8>) -> String? in if uname(UnsafeMutablePointer(body.baseAddress)) != 0 { return nil } return String.fromCString(UnsafePointer(body.baseAddress.advancedBy(Int(_SYS_NAMELEN * 4)))) } let deviceNamesByCode : [String: String] = ["iPod1,1":"iPod Touch 1", "iPod2,1":"iPod Touch 2", "iPod3,1":"iPod Touch 3", "iPod4,1":"iPod Touch 4", "iPod5,1":"iPod Touch 5", "iPod7,1":"iPod Touch 6", "iPhone1,1":"iPhone", "iPhone1,2":"iPhone ", "iPhone2,1":"iPhone ", "iPhone3,1":"iPhone 4", "iPhone3,2":"iPhone 4", "iPhone3,3":"iPhone 4", "iPhone4,1":"iPhone 4s", "iPhone5,1":"iPhone 5", "iPhone5,2":"iPhone 5", "iPhone5,3":"iPhone 5c", "iPhone5,4":"iPhone 5c", "iPhone6,1":"iPhone 5s", "iPhone6,2":"iPhone 5s", "iPhone7,2":"iPhone 6", "iPhone7,1":"iPhone 6 Plus", "iPhone8,1":"iPhone 6s", "iPhone8,2":"iPhone 6s Plus", "iPhone8,4":"iPhone SE", "iPad2,1":"iPad 2", "iPad2,2":"iPad 2", "iPad2,3":"iPad 2", "iPad2,4":"iPad 2", "iPad3,1":"iPad 3", "iPad3,2":"iPad 3", "iPad3,3":"iPad 3", "iPad3,4":"iPad 4", "iPad3,5":"iPad 4", "iPad3,6":"iPad 4", "iPad4,1":"iPad Air", "iPad4,2":"iPad Air", "iPad4,3":"iPad Air", "iPad5,3":"iPad Air 2", "iPad5,4":"iPad Air 2", "iPad2,5":"iPad Mini", "iPad2,6":"iPad Mini", "iPad2,7":"iPad Mini", "iPad4,4":"iPad Mini 2", "iPad4,5":"iPad Mini 2", "iPad4,6":"iPad Mini 2", "iPad4,7":"iPad Mini 3", "iPad4,8":"iPad Mini 3", "iPad4,9":"iPad Mini 3", "iPad5,1":"iPad Mini 4", "iPad5,2":"iPad Mini 4", "iPad6,3":"iPad Pro", "iPad6,4":"iPad Pro", "iPad6,7":"iPad Pro", "iPad6,8":"iPad Pro", "AppleTV5,3":"Apple TV", "i386":"Simulator", "x86_64":"Simulator" ] if model!.characters.count > 0 { myDeviceName = deviceNamesByCode[model!]! }else{ myDeviceName = UIDevice.currentDevice().model } print("myDeviceName==/(myDeviceName)") return myDeviceName }


Swift 3 compatible

// MARK: - UIDevice Extension - private let DeviceList = [ /* iPod 5 */ "iPod5,1": "iPod Touch 5", /* iPhone 4 */ "iPhone3,1": "iPhone 4", "iPhone3,2": "iPhone 4", "iPhone3,3": "iPhone 4", /* iPhone 4S */ "iPhone4,1": "iPhone 4S", /* iPhone 5 */ "iPhone5,1": "iPhone 5", "iPhone5,2": "iPhone 5", /* iPhone 5C */ "iPhone5,3": "iPhone 5C", "iPhone5,4": "iPhone 5C", /* iPhone 5S */ "iPhone6,1": "iPhone 5S", "iPhone6,2": "iPhone 5S", /* iPhone 6 */ "iPhone7,2": "iPhone 6", /* iPhone 6 Plus */ "iPhone7,1": "iPhone 6 Plus", /* iPhone 6S */ "iPhone8,1": "iPhone 6S", /* iPhone 6S Plus */ "iPhone8,2": "iPhone 6S Plus", /* iPhone SE */ "iPhone8,4": "iPhone SE", /* iPhone 7 */ "iPhone9,1": "iPhone 7", /* iPhone 7 */ "iPhone9,3": "iPhone 7", /* iPhone 7 Plus */ "iPhone9,2": "iPhone 7 Plus", /* iPhone 7 Plus */ "iPhone9,4": "iPhone 7 Plus", /* iPad 2 */ "iPad2,1": "iPad 2", "iPad2,2": "iPad 2", "iPad2,3": "iPad 2", "iPad2,4": "iPad 2", /* iPad 3 */ "iPad3,1": "iPad 3", "iPad3,2": "iPad 3", "iPad3,3": "iPad 3", /* iPad 4 */ "iPad3,4": "iPad 4", "iPad3,5": "iPad 4", "iPad3,6": "iPad 4", /* iPad Air */ "iPad4,1": "iPad Air", "iPad4,2": "iPad Air", "iPad4,3": "iPad Air", /* iPad Air 2 */ "iPad5,1": "iPad Air 2", "iPad5,3": "iPad Air 2", "iPad5,4": "iPad Air 2", /* iPad Mini */ "iPad2,5": "iPad Mini 1", "iPad2,6": "iPad Mini 1", "iPad2,7": "iPad Mini 1", /* iPad Mini 2 */ "iPad4,4": "iPad Mini 2", "iPad4,5": "iPad Mini 2", "iPad4,6": "iPad Mini 2", /* iPad Mini 3 */ "iPad4,7": "iPad Mini 3", "iPad4,8": "iPad Mini 3", "iPad4,9": "iPad Mini 3", /* iPad Pro 12.9 */ "iPad6,7": "iPad Pro 12.9", "iPad6,8": "iPad Pro 12.9", /* iPad Pro 9.7 */ "iPad6,3": "iPad Pro 9.7", "iPad6,4": "iPad Pro 9.7", /* Simulator */ "x86_64": "Simulator", "i386": "Simulator" ] extension UIDevice { static var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machine = systemInfo.machine let mirror = Mirror(reflecting: machine) var identifier = "" for child in mirror.children { if let value = child.value as? Int8, value != 0 { identifier += String(UnicodeScalar(UInt8(value))) } } return DeviceList[identifier] ?? identifier } static var isIphone4: Bool { return modelName == "iPhone 5" || modelName == "iPhone 5C" || modelName == "iPhone 5S" || UIDevice.isSimulatorIPhone4 } static var isIphone5: Bool { return modelName == "iPhone 4S" || modelName == "iPhone 4" || UIDevice.isSimulatorIPhone5 } static var isIphone6: Bool { return modelName == "iPhone 6" || UIDevice.isSimulatorIPhone6 } static var isIphone6Plus: Bool { return modelName == "iPhone 6 Plus" || UIDevice.isSimulatorIPhone6Plus } static var isIpad: Bool { if UIDevice.current.model.contains("iPad") { return true } return false } static var isIphone: Bool { return !self.isIpad } /// Check if current device is iPhone4S (and earlier) relying on screen heigth static var isSimulatorIPhone4: Bool { return UIDevice.isSimulatorWithScreenHeigth(480) } /// Check if current device is iPhone5 relying on screen heigth static var isSimulatorIPhone5: Bool { return UIDevice.isSimulatorWithScreenHeigth(568) } /// Check if current device is iPhone6 relying on screen heigth static var isSimulatorIPhone6: Bool { return UIDevice.isSimulatorWithScreenHeigth(667) } /// Check if current device is iPhone6 Plus relying on screen heigth static var isSimulatorIPhone6Plus: Bool { return UIDevice.isSimulatorWithScreenHeigth(736) } private static func isSimulatorWithScreenHeigth(_ heigth: CGFloat) -> Bool { let screenSize: CGRect = UIScreen.main.bounds return modelName == "Simulator" && screenSize.height == heigth } }


Swift 4 o más tarde

extension UIDevice { var modelName: String { if let modelName = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] { return modelName } var info = utsname() uname(&info) return String(String.UnicodeScalarView( Mirror(reflecting: info.machine) .children .compactMap { guard let value = $0.value as? Int8 else { return nil } let unicode = UnicodeScalar(UInt8(value)) return unicode.isASCII ? unicode : nil })) } }

UIDevice.current.modelName // "iPad6,4"


Esta solución funciona tanto para los dispositivos físicos como para el simulador de iOS de manera que el simulador devuelve el mismo modelo que el dispositivo físico para un modelo, por ejemplo, "iPhone10,6" para iPhone X (GSM) en lugar de "x86_64".

Definición - Swift 4:

import UIKit extension UIDevice { var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } if let value = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] { return value } else { return identifier } } }

Uso:

print(UIDevice.current.modelName)


Para ahorrar tiempo de los demás. Debido a que fue aceptado, debo votar, proponer una biblioteca que use API privada y mi aplicación fue rechazada debido a uidevice-extension ¡ayer mismo! Estoy cambiando a la biblioteca GBDeviceInfo, instalada también como pod, por ahora se ve bien, mantenida y actualizada a los dispositivos más recientes.


Si tiene una gran cantidad de dispositivos (p. Ej., Mantenidos por @Tib en https://.com/a/17655825/849616 ) para manejarlo si Swift 3 usaría:

extension UIDevice { /// Fetches the information about the name of the device. /// /// - Returns: Should return meaningful device name, if not found will return device system code. public static func modelName() -> String { let physicalName = deviceSystemCode() if let deviceTypes = deviceTypes(), let modelName = deviceTypes[physicalName] as? String { return modelName } return physicalName } } private extension UIDevice { /// Fetches from system the code of the device static func deviceSystemCode() -> String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return identifier } /// Fetches the plist entries from plist maintained in https://.com/a/17655825/849616 /// /// - Returns: A dictionary with pairs of deviceSystemCode <-> meaningfulDeviceName. static func deviceTypes() -> NSDictionary? { if let fileUrl = Bundle.main.url(forResource: "your plist name", withExtension: "plist"), let configurationDictionary = NSDictionary(contentsOf: fileUrl) { return configurationDictionary } return nil } }

Más tarde se le puede llamar usando UIDevice.modelName().

Créditos adicionales van a @Tib (para obtener una lista), @Aniruddh Joshi (para deviceSystemCode()función).


#import <sys/utsname.h> #define HARDWARE @{@"i386": @"Simulator",@"x86_64": @"Simulator",@"iPod1,1": @"iPod Touch",@"iPod2,1": @"iPod Touch 2nd Generation",@"iPod3,1": @"iPod Touch 3rd Generation",@"iPod4,1": @"iPod Touch 4th Generation",@"iPhone1,1": @"iPhone",@"iPhone1,2": @"iPhone 3G",@"iPhone2,1": @"iPhone 3GS",@"iPhone3,1": @"iPhone 4",@"iPhone4,1": @"iPhone 4S",@"iPhone5,1": @"iPhone 5",@"iPhone5,2": @"iPhone 5",@"iPhone5,3": @"iPhone 5c",@"iPhone5,4": @"iPhone 5c",@"iPhone6,1": @"iPhone 5s",@"iPhone6,2": @"iPhone 5s",@"iPad1,1": @"iPad",@"iPad2,1": @"iPad 2",@"iPad3,1": @"iPad 3rd Generation ",@"iPad3,4": @"iPad 4th Generation ",@"iPad2,5": @"iPad Mini",@"iPad4,4": @"iPad Mini 2nd Generation - Wifi",@"iPad4,5": @"iPad Mini 2nd Generation - Cellular",@"iPad4,1": @"iPad Air 5th Generation - Wifi",@"iPad4,2": @"iPad Air 5th Generation - Cellular"} @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; struct utsname systemInfo; uname(&systemInfo); NSLog(@"hardware: %@",[HARDWARE objectForKey:[NSString stringWithCString: systemInfo.machine encoding:NSUTF8StringEncoding]]); }


// // UIDevice+Hardware.h // gauravds // #import <UIKit/UIKit.h> @interface UIDevice (Hardware) - (NSString *)modelIdentifier; - (NSString *)modelName; @end

¿Por qué no crear una categoría. No use el problema de fuga de seguridad del método malloc. Usa funciones seguras.

NSLog(@"%@ %@", [[UIDevice currentDevice] modelName], [[UIDevice currentDevice] modelIdentifier]);

Ver las implicaciones

// // UIDevice+Hardware.m // gauravds // #import "UIDevice+Hardware.h" #import <sys/utsname.h> @implementation UIDevice (Hardware) - (NSString *)modelIdentifier { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } - (NSString *)modelName { return [self modelNameForModelIdentifier:[self modelIdentifier]]; } - (NSString *)modelNameForModelIdentifier:(NSString *)modelIdentifier { // iPhone http://theiphonewiki.com/wiki/IPhone if ([modelIdentifier isEqualToString:@"iPhone1,1"]) return @"iPhone 1G"; if ([modelIdentifier isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([modelIdentifier isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; if ([modelIdentifier isEqualToString:@"iPhone3,1"]) return @"iPhone 4 (GSM)"; if ([modelIdentifier isEqualToString:@"iPhone3,2"]) return @"iPhone 4 (GSM Rev A)"; if ([modelIdentifier isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (CDMA)"; if ([modelIdentifier isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; if ([modelIdentifier isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM)"; if ([modelIdentifier isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (Global)"; if ([modelIdentifier isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)"; if ([modelIdentifier isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (Global)"; if ([modelIdentifier isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)"; if ([modelIdentifier isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (Global)"; if ([modelIdentifier isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; if ([modelIdentifier isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; if ([modelIdentifier isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; if ([modelIdentifier isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; if ([modelIdentifier isEqualToString:@"iPhone8,4"]) return @"iPhone SE"; if ([modelIdentifier isEqualToString:@"iPhone9,1"]) return @"iPhone 7"; if ([modelIdentifier isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; if ([modelIdentifier isEqualToString:@"iPhone9,3"]) return @"iPhone 7"; if ([modelIdentifier isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus"; if ([modelIdentifier isEqualToString:@"iPhone10,1"]) return @"iPhone 8"; // US (Verizon), China, Japan if ([modelIdentifier isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus"; // US (Verizon), China, Japan if ([modelIdentifier isEqualToString:@"iPhone10,3"]) return @"iPhone X"; // US (Verizon), China, Japan if ([modelIdentifier isEqualToString:@"iPhone10,4"]) return @"iPhone 8"; // AT&T, Global if ([modelIdentifier isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus"; // AT&T, Global if ([modelIdentifier isEqualToString:@"iPhone10,6"]) return @"iPhone X"; // AT&T, Global // iPad http://theiphonewiki.com/wiki/IPad if ([modelIdentifier isEqualToString:@"iPad1,1"]) return @"iPad 1G"; if ([modelIdentifier isEqualToString:@"iPad2,1"]) return @"iPad 2 (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)"; if ([modelIdentifier isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; if ([modelIdentifier isEqualToString:@"iPad2,4"]) return @"iPad 2 (Rev A)"; if ([modelIdentifier isEqualToString:@"iPad3,1"]) return @"iPad 3 (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM)"; if ([modelIdentifier isEqualToString:@"iPad3,3"]) return @"iPad 3 (Global)"; if ([modelIdentifier isEqualToString:@"iPad3,4"]) return @"iPad 4 (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad3,5"]) return @"iPad 4 (GSM)"; if ([modelIdentifier isEqualToString:@"iPad3,6"]) return @"iPad 4 (Global)"; if ([modelIdentifier isEqualToString:@"iPad6,11"]) return @"iPad (5th gen) (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad6,12"]) return @"iPad (5th gen) (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad4,1"]) return @"iPad Air (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad5,3"]) return @"iPad Air 2 (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad5,4"]) return @"iPad Air 2 (Cellular)"; // iPad Mini http://theiphonewiki.com/wiki/IPad_mini if ([modelIdentifier isEqualToString:@"iPad2,5"]) return @"iPad mini 1G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad2,6"]) return @"iPad mini 1G (GSM)"; if ([modelIdentifier isEqualToString:@"iPad2,7"]) return @"iPad mini 1G (Global)"; if ([modelIdentifier isEqualToString:@"iPad4,4"]) return @"iPad mini 2G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad4,5"]) return @"iPad mini 2G (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad4,6"]) return @"iPad mini 2G (Cellular)"; // TD-LTE model see https://support.apple.com/en-us/HT201471#iPad-mini2 if ([modelIdentifier isEqualToString:@"iPad4,7"]) return @"iPad mini 3G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad4,8"]) return @"iPad mini 3G (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad4,9"]) return @"iPad mini 3G (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad5,1"]) return @"iPad mini 4G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad5,2"]) return @"iPad mini 4G (Cellular)"; // iPad Pro https://www.theiphonewiki.com/wiki/IPad_Pro if ([modelIdentifier isEqualToString:@"iPad6,3"]) return @"iPad Pro (9.7 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=9938&c=apple_ipad_pro_9.7-inch_a1673_wifi_32gb_apple_ipad_6,3 if ([modelIdentifier isEqualToString:@"iPad6,4"]) return @"iPad Pro (9.7 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=9981&c=apple_ipad_pro_9.7-inch_a1675_td-lte_32gb_apple_ipad_6,4 if ([modelIdentifier isEqualToString:@"iPad6,7"]) return @"iPad Pro (12.9 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=8960&c=apple_ipad_pro_wifi_a1584_128gb if ([modelIdentifier isEqualToString:@"iPad6,8"]) return @"iPad Pro (12.9 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=8965&c=apple_ipad_pro_td-lte_a1652_32gb_apple_ipad_6,8 if ([modelIdentifier isEqualToString:@"iPad 7,1"]) return @"iPad Pro (12.9 inch) 2G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad 7,2"]) return @"iPad Pro (12.9 inch) 2G (Cellular)"; if ([modelIdentifier isEqualToString:@"iPad 7,3"]) return @"iPad Pro (10.5 inch) 1G (Wi-Fi)"; if ([modelIdentifier isEqualToString:@"iPad 7,4"]) return @"iPad Pro (10.5 inch) 1G (Cellular)"; // iPod http://theiphonewiki.com/wiki/IPod if ([modelIdentifier isEqualToString:@"iPod1,1"]) return @"iPod touch 1G"; if ([modelIdentifier isEqualToString:@"iPod2,1"]) return @"iPod touch 2G"; if ([modelIdentifier isEqualToString:@"iPod3,1"]) return @"iPod touch 3G"; if ([modelIdentifier isEqualToString:@"iPod4,1"]) return @"iPod touch 4G"; if ([modelIdentifier isEqualToString:@"iPod5,1"]) return @"iPod touch 5G"; if ([modelIdentifier isEqualToString:@"iPod7,1"]) return @"iPod touch 6G"; // as 6,1 was never released 7,1 is actually 6th generation // Apple TV https://www.theiphonewiki.com/wiki/Apple_TV if ([modelIdentifier isEqualToString:@"AppleTV1,1"]) return @"Apple TV 1G"; if ([modelIdentifier isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2G"; if ([modelIdentifier isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3G"; if ([modelIdentifier isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3G"; // small, incremental update over 3,1 if ([modelIdentifier isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4G"; // as 4,1 was never released, 5,1 is actually 4th generation // Simulator if ([modelIdentifier hasSuffix:@"86"] || [modelIdentifier isEqual:@"x86_64"]) { BOOL smallerScreen = ([[UIScreen mainScreen] bounds].size.width < 768.0); return (smallerScreen ? @"iPhone Simulator" : @"iPad Simulator"); } return modelIdentifier; } @end