tengo saber que puedo descargar como bloqueado apple actualizar ios iphone swift device

ios - saber - itunes



¿Cómo determinar el modelo actual de iPhone/dispositivo? (26)

¿Hay alguna manera de obtener el nombre del modelo del dispositivo (iPhone 4S, iPhone 5, iPhone 5S, etc.) en Swift?

Sé que hay una propiedad llamada UIDevice.currentDevice().model pero solo devuelve el tipo de dispositivo (iPod touch, iPhone, iPad, iPhone Simulator, etc.).

También sé que se puede hacer fácilmente en Objective-C con este método:

#import <sys/utsname.h> struct utsname systemInfo; uname(&systemInfo); NSString* deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

Pero estoy desarrollando mi aplicación para iPhone en Swift, ¿podría alguien ayudarme con la forma equivalente de resolver esto en Swift?


Swift 4 tanto dispositivo / simulador

y nuevo iPhone XR, XS, XS Max

PS (este método detecta también el modelo correcto si se trata de un simulador y el modelo de dispositivo de simulador utilizado ):

public enum Model : String { case simulator = "simulator/sandbox", //iPod iPod1 = "iPod 1", iPod2 = "iPod 2", iPod3 = "iPod 3", iPod4 = "iPod 4", iPod5 = "iPod 5", //iPad iPad2 = "iPad 2", iPad3 = "iPad 3", iPad4 = "iPad 4", iPadAir = "iPad Air ", iPadAir2 = "iPad Air 2", iPad5 = "iPad 5", //aka iPad 2017 iPad6 = "iPad 6", //aka iPad 2018 //iPad mini iPadMini = "iPad Mini", iPadMini2 = "iPad Mini 2", iPadMini3 = "iPad Mini 3", iPadMini4 = "iPad Mini 4", //iPad pro iPadPro9_7 = "iPad Pro 9.7/"", iPadPro10_5 = "iPad Pro 10.5/"", iPadPro12_9 = "iPad Pro 12.9/"", iPadPro2_12_9 = "iPad Pro 2 12.9/"", //iPhone iPhone4 = "iPhone 4", iPhone4S = "iPhone 4S", iPhone5 = "iPhone 5", iPhone5S = "iPhone 5S", iPhone5C = "iPhone 5C", iPhone6 = "iPhone 6", iPhone6plus = "iPhone 6 Plus", iPhone6S = "iPhone 6S", iPhone6Splus = "iPhone 6S Plus", iPhoneSE = "iPhone SE", iPhone7 = "iPhone 7", iPhone7plus = "iPhone 7 Plus", iPhone8 = "iPhone 8", iPhone8plus = "iPhone 8 Plus", iPhoneX = "iPhone X", iPhoneXS = "iPhone XS", iPhoneXSMax = "iPhone XS Max", iPhoneXR = "iPhone XR", //Apple TV AppleTV = "Apple TV", AppleTV_4K = "Apple TV 4K", unrecognized = "?unrecognized?" } // #-#-#-#-#-#-#-#-#-#-#-#-#-#-# //MARK: UIDevice extensions // #-#-#-#-#-#-#-#-#-#-#-#-#-#-# public extension UIDevice { public var type: Model { var systemInfo = utsname() uname(&systemInfo) let modelCode = withUnsafePointer(to: &systemInfo.machine) { $0.withMemoryRebound(to: CChar.self, capacity: 1) { ptr in String.init(validatingUTF8: ptr) } } var modelMap : [ String : Model ] = [ "i386" : .simulator, "x86_64" : .simulator, //iPod "iPod1,1" : .iPod1, "iPod2,1" : .iPod2, "iPod3,1" : .iPod3, "iPod4,1" : .iPod4, "iPod5,1" : .iPod5, //iPad "iPad2,1" : .iPad2, "iPad2,2" : .iPad2, "iPad2,3" : .iPad2, "iPad2,4" : .iPad2, "iPad3,1" : .iPad3, "iPad3,2" : .iPad3, "iPad3,3" : .iPad3, "iPad3,4" : .iPad4, "iPad3,5" : .iPad4, "iPad3,6" : .iPad4, "iPad4,1" : .iPadAir, "iPad4,2" : .iPadAir, "iPad4,3" : .iPadAir, "iPad5,3" : .iPadAir2, "iPad5,4" : .iPadAir2, "iPad6,11" : .iPad5, //aka iPad 2017 "iPad6,12" : .iPad5, "iPad7,5" : .iPad6, //aka iPad 2018 "iPad7,6" : .iPad6, //iPad mini "iPad2,5" : .iPadMini, "iPad2,6" : .iPadMini, "iPad2,7" : .iPadMini, "iPad4,4" : .iPadMini2, "iPad4,5" : .iPadMini2, "iPad4,6" : .iPadMini2, "iPad4,7" : .iPadMini3, "iPad4,8" : .iPadMini3, "iPad4,9" : .iPadMini3, "iPad5,1" : .iPadMini4, "iPad5,2" : .iPadMini4, //iPad pro "iPad6,3" : .iPadPro9_7, "iPad6,4" : .iPadPro9_7, "iPad7,3" : .iPadPro10_5, "iPad7,4" : .iPadPro10_5, "iPad6,7" : .iPadPro12_9, "iPad6,8" : .iPadPro12_9, "iPad7,1" : .iPadPro2_12_9, "iPad7,2" : .iPadPro2_12_9, //iPhone "iPhone3,1" : .iPhone4, "iPhone3,2" : .iPhone4, "iPhone3,3" : .iPhone4, "iPhone4,1" : .iPhone4S, "iPhone5,1" : .iPhone5, "iPhone5,2" : .iPhone5, "iPhone5,3" : .iPhone5C, "iPhone5,4" : .iPhone5C, "iPhone6,1" : .iPhone5S, "iPhone6,2" : .iPhone5S, "iPhone7,1" : .iPhone6plus, "iPhone7,2" : .iPhone6, "iPhone8,1" : .iPhone6S, "iPhone8,2" : .iPhone6Splus, "iPhone8,4" : .iPhoneSE, "iPhone9,1" : .iPhone7, "iPhone9,3" : .iPhone7, "iPhone9,2" : .iPhone7plus, "iPhone9,4" : .iPhone7plus, "iPhone10,1" : .iPhone8, "iPhone10,4" : .iPhone8, "iPhone10,2" : .iPhone8plus, "iPhone10,5" : .iPhone8plus, "iPhone10,3" : .iPhoneX, "iPhone10,6" : .iPhoneX, "iPhone11,2" : .iPhoneXS, "iPhone11,4" : .iPhoneXSMax, "iPhone11,6" : .iPhoneXSMax, "iPhone11,8" : .iPhoneXR, //AppleTV "AppleTV5,3" : .AppleTV, "AppleTV6,2" : .AppleTV_4K ] if let model = modelMap[String.init(validatingUTF8: modelCode!)!] { if model == .simulator { if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { if let simModel = modelMap[String.init(validatingUTF8: simModelCode)!] { return simModel } } } return model } return Model.unrecognized } }

Uso : obtienes tu modelo simplemente con:

let deviceType = UIDevice().type

o imprima la cadena exacta con:

print("/(UIDevice().type.rawvalue)")

Salida:

iPhone X

Otro ejemplo :

var myDefaultFontSize:CGFloat = 26.0 switch UIDevice().type { case .iPhoneSE,.iPhone5,.iPhone5S: print("default value") case .iPhone6,.iPhone7,.iPhone8,.iPhone6S, .iPhoneX : myDefaultFontSize += 4 default:break }

Para ver modelos de dispositivos de Apple visite: https://www.theiphonewiki.com/wiki/Models


¡Hay algunos problemas con la respuesta aceptada cuando usas Swift 3! Esta respuesta (inspirada en NAZIK) funciona con Swift 3 y los nuevos modelos de iPhone:

import UIKit public extension UIDevice { var modelName: String { #if (arch(i386) || arch(x86_64)) && os(iOS) let DEVICE_IS_SIMULATOR = true #else let DEVICE_IS_SIMULATOR = false #endif var machineString = String() if DEVICE_IS_SIMULATOR == true { if let dir = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { machineString = dir } } else { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) machineString = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8 , value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } } switch machineString { case "iPod4,1": return "iPod Touch 4G" case "iPod5,1": return "iPod Touch 5G" case "iPod7,1": return "iPod Touch 6G" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone 9,4": return "iPhone 7 Plus" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4": return "iPad Pro (9.7 inch)" case "iPad6,7", "iPad6,8": return "iPad Pro (12.9 inch)" case "AppleTV5,3": return "Apple TV" default: return machineString } } }


Este ejemplo de Swift 3.0 devuelve el modelo de dispositivo actual como una constante de enum (para evitar comparaciones directas con literales de cadena). El valor bruto de la enumeración es una String contiene el nombre del dispositivo iOS legible. Como es Swift, la lista de dispositivos reconocidos solo incluye modelos lo suficientemente recientes como para admitir las versiones de iOS que incluyen Swift. El siguiente ejemplo de uso utiliza la implementación al final de esta respuesta:

switch UIDevice().type { case .iPhone5: print("No TouchID sensor") case .iPhone5S: fallthrough case .iPhone6: fallthrough case .iPhone6plus: fallthrough case .iPad_Pro9_7: fallthrough case .iPad_Pro12_9: fallthrough case .iPhone7: fallthrough case .iPhone7plus: print("Put your thumb on the " + UIDevice().type.rawValue + " TouchID sensor") case .unrecognized: print("Device model unrecognized"); default: print(UIDevice().type.rawValue + " not supported by this app"); }

Su aplicación debe mantenerse actualizada para las nuevas versiones de dispositivos y también cuando Apple agregue nuevos modelos para la misma familia de dispositivos. Por ejemplo, iPhone3,1 iPhone3,2 iPhone3,4 son todos "iPhone 4". Evite escribir código que no tenga en cuenta los nuevos modelos, para que sus algoritmos no dejen de configurar o responder inesperadamente a un nuevo dispositivo. Puede consultar esta lista actualizada de modelos de dispositivos iOS para actualizar su aplicación en momentos estratégicos.

iOS incluye interfaces independientes del dispositivo para detectar capacidades y parámetros de hardware como el tamaño de la pantalla. Las interfaces generalizadas que proporciona Apple suelen ser los mecanismos más seguros y mejor admitidos para adaptar dinámicamente el comportamiento de una aplicación a un hardware diferente. Sin embargo, el siguiente código puede ser útil para la creación de prototipos, la depuración, las pruebas o cualquier otro momento en que el código tenga como objetivo una familia de dispositivos específica. Esta técnica también puede ser útil para describir el dispositivo actual por su nombre común / reconocido públicamente.

Swift 3

// 1. Declare outside class definition (or in its own file). // 2. UIKit must be included in file where this code is added. // 3. Extends UIDevice class, thus is available anywhere in app. // // Usage example: // // if UIDevice().type == .simulator { // print("You''re running on the simulator... boring!") // } else { // print("Wow! Running on a /(UIDevice().type.rawValue)") // } import UIKit public enum Model : String { case simulator = "simulator/sandbox", iPod1 = "iPod 1", iPod2 = "iPod 2", iPod3 = "iPod 3", iPod4 = "iPod 4", iPod5 = "iPod 5", iPad2 = "iPad 2", iPad3 = "iPad 3", iPad4 = "iPad 4", iPhone4 = "iPhone 4", iPhone4S = "iPhone 4S", iPhone5 = "iPhone 5", iPhone5S = "iPhone 5S", iPhone5C = "iPhone 5C", iPadMini1 = "iPad Mini 1", iPadMini2 = "iPad Mini 2", iPadMini3 = "iPad Mini 3", iPadAir1 = "iPad Air 1", iPadAir2 = "iPad Air 2", iPadPro9_7 = "iPad Pro 9.7/"", iPadPro9_7_cell = "iPad Pro 9.7/" cellular", iPadPro10_5 = "iPad Pro 10.5/"", iPadPro10_5_cell = "iPad Pro 10.5/" cellular", iPadPro12_9 = "iPad Pro 12.9/"", iPadPro12_9_cell = "iPad Pro 12.9/" cellular", iPhone6 = "iPhone 6", iPhone6plus = "iPhone 6 Plus", iPhone6S = "iPhone 6S", iPhone6Splus = "iPhone 6S Plus", iPhoneSE = "iPhone SE", iPhone7 = "iPhone 7", iPhone7plus = "iPhone 7 Plus", iPhone8 = "iPhone 8", iPhone8plus = "iPhone 8 Plus", iPhoneX = "iPhone X", iPhoneXS = "iPhone XS", iPhoneXSmax = "iPhone XS Max", iPhoneXR = "iPhone XR", unrecognized = "?unrecognized?" } public extension UIDevice { public var type: Model { var systemInfo = utsname() uname(&systemInfo) let modelCode = withUnsafePointer(to: &systemInfo.machine) { $0.withMemoryRebound(to: CChar.self, capacity: 1) { ptr in String.init(validatingUTF8: ptr) } } var modelMap : [ String : Model ] = [ "i386" : .simulator, "x86_64" : .simulator, "iPod1,1" : .iPod1, "iPod2,1" : .iPod2, "iPod3,1" : .iPod3, "iPod4,1" : .iPod4, "iPod5,1" : .iPod5, "iPad2,1" : .iPad2, "iPad2,2" : .iPad2, "iPad2,3" : .iPad2, "iPad2,4" : .iPad2, "iPad2,5" : .iPadMini1, "iPad2,6" : .iPadMini1, "iPad2,7" : .iPadMini1, "iPhone3,1" : .iPhone4, "iPhone3,2" : .iPhone4, "iPhone3,3" : .iPhone4, "iPhone4,1" : .iPhone4S, "iPhone5,1" : .iPhone5, "iPhone5,2" : .iPhone5, "iPhone5,3" : .iPhone5C, "iPhone5,4" : .iPhone5C, "iPad3,1" : .iPad3, "iPad3,2" : .iPad3, "iPad3,3" : .iPad3, "iPad3,4" : .iPad4, "iPad3,5" : .iPad4, "iPad3,6" : .iPad4, "iPhone6,1" : .iPhone5S, "iPhone6,2" : .iPhone5S, "iPad4,1" : .iPadAir1, "iPad4,2" : .iPadAir2, "iPad4,4" : .iPadMini2, "iPad4,5" : .iPadMini2, "iPad4,6" : .iPadMini2, "iPad4,7" : .iPadMini3, "iPad4,8" : .iPadMini3, "iPad4,9" : .iPadMini3, "iPad6,3" : .iPadPro9_7, "iPad6,11" : .iPadPro9_7, "iPad6,4" : .iPadPro9_7_cell, "iPad6,12" : .iPadPro9_7_cell, "iPad6,7" : .iPadPro12_9, "iPad6,8" : .iPadPro12_9_cell, "iPad7,3" : .iPadPro10_5, "iPad7,4" : .iPadPro10_5_cell, "iPhone7,1" : .iPhone6plus, "iPhone7,2" : .iPhone6, "iPhone8,1" : .iPhone6S, "iPhone8,2" : .iPhone6Splus, "iPhone8,4" : .iPhoneSE, "iPhone9,1" : .iPhone7, "iPhone9,2" : .iPhone7plus, "iPhone9,3" : .iPhone7, "iPhone9,4" : .iPhone7plus, "iPhone10,1" : .iPhone8, "iPhone10,2" : .iPhone8plus, "iPhone10,3" : .iPhoneX, "iPhone10,6" : .iPhoneX, "iPhone11,2" : .iPhoneXS, "iPhone11,4" : .iPhoneXSmax, "iPhone11,6" : .iPhoneXSmax, "iPhone11,8" : .iPhoneXR ] if let model = modelMap[String.init(validatingUTF8: modelCode!)!] { return model } return Model.unrecognized } }


He encontrado que muchas de estas respuestas usan cadenas. Decidí cambiar la respuesta de @HAS para usar una enumeración:

public enum Devices: String { case IPodTouch5 case IPodTouch6 case IPhone4 case IPhone4S case IPhone5 case IPhone5C case IPhone5S case IPhone6 case IPhone6Plus case IPhone6S case IPhone6SPlus case IPhone7 case IPhone7Plus case IPhoneSE case IPad2 case IPad3 case IPad4 case IPadAir case IPadAir2 case IPadMini case IPadMini2 case IPadMini3 case IPadMini4 case IPadPro case AppleTV case Simulator case Other } public extension UIDevice { public var modelName: Devices { 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))) } switch identifier { case "iPod5,1": return Devices.IPodTouch5 case "iPod7,1": return Devices.IPodTouch6 case "iPhone3,1", "iPhone3,2", "iPhone3,3": return Devices.IPhone4 case "iPhone4,1": return Devices.IPhone4S case "iPhone5,1", "iPhone5,2": return Devices.IPhone5 case "iPhone5,3", "iPhone5,4": return Devices.IPhone5C case "iPhone6,1", "iPhone6,2": return Devices.IPhone5S case "iPhone7,2": return Devices.IPhone6 case "iPhone7,1": return Devices.IPhone6Plus case "iPhone8,1": return Devices.IPhone6S case "iPhone8,2": return Devices.IPhone6SPlus case "iPhone9,1", "iPhone9,3": return Devices.IPhone7 case "iPhone9,2", "iPhone9,4": return Devices.IPhone7Plus case "iPhone8,4": return Devices.IPhoneSE case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return Devices.IPad2 case "iPad3,1", "iPad3,2", "iPad3,3": return Devices.IPad3 case "iPad3,4", "iPad3,5", "iPad3,6": return Devices.IPad4 case "iPad4,1", "iPad4,2", "iPad4,3": return Devices.IPadAir case "iPad5,3", "iPad5,4": return Devices.IPadAir2 case "iPad2,5", "iPad2,6", "iPad2,7": return Devices.IPadMini case "iPad4,4", "iPad4,5", "iPad4,6": return Devices.IPadMini2 case "iPad4,7", "iPad4,8", "iPad4,9": return Devices.IPadMini3 case "iPad5,1", "iPad5,2": return Devices.IPadMini4 case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return Devices.IPadPro case "AppleTV5,3": return Devices.AppleTV case "i386", "x86_64": return Devices.Simulator default: return Devices.Other } } }


He implementado una biblioteca súper liviana para detectar el dispositivo utilizado según algunas de las respuestas dadas: https://github.com/schickling/Device.swift

Puede instalarse a través de Carthage y usarse de esta manera:

import Device let deviceType = UIDevice.currentDevice().deviceType switch deviceType { case .IPhone6: print("Do stuff for iPhone6") case .IPadMini: print("Do stuff for iPad mini") default: print("Check other available cases of DeviceType") }


Hice esta extensión "pura Swift" en UIDevice .

Esta versión funciona en Swift 2 o superior. Si usa una versión anterior, use una versión anterior de mi respuesta .

Si está buscando una solución más elegante, puede usar mi µ-framework DeviceKit publicado en GitHub (también disponible a través de CocoaPods, Carthage y Swift Package Manager).

Aquí está el código:

import UIKit public extension UIDevice { static let 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))) } func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity #if os(iOS) switch identifier { case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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 "iPhone9,1", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" case "iPhone8,4": return "iPhone SE" case "iPhone10,1", "iPhone10,4": return "iPhone 8" case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus" case "iPhone10,3", "iPhone10,6": return "iPhone X" case "iPhone11,2": return "iPhone XS" case "iPhone11,4", "iPhone11,6": return "iPhone XS Max" case "iPhone11,8": return "iPhone XR" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad6,11", "iPad6,12": return "iPad 5" case "iPad7,5", "iPad7,6": return "iPad 6" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)" case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch)" case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd generation)" case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)" case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)" case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd generation)" case "AppleTV5,3": return "Apple TV" case "AppleTV6,2": return "Apple TV 4K" case "AudioAccessory1,1": return "HomePod" case "i386", "x86_64": return "Simulator /(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))" default: return identifier } #elseif os(tvOS) switch identifier { case "AppleTV5,3": return "Apple TV 4" case "AppleTV6,2": return "Apple TV 4K" case "i386", "x86_64": return "Simulator /(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))" default: return identifier } #endif } return mapToDevice(identifier: identifier) }() }

Lo llamas así:

let modelName = UIDevice.modelName

Para dispositivos reales devuelve, por ejemplo, "iPad Pro 9.7 Pulgada", para simuladores, devuelve "Simulador" + identificador del simulador, por ejemplo, "Simulador iPad Pro 9.7 Pulgada"


Hice otra extensión de muestra en UIDevice para incluir el identificador del modelo del simulador en la answer @ HAS:

public extension UIDevice { /// pares the deveice name as the standard name var modelName: String { #if (arch(i386) || arch(x86_64)) && os(iOS) let identifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"]! #else 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))) } #endif switch identifier { case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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 "iPhone9,1", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" case "iPhone8,4": return "iPhone SE" case "iPhone10,1", "iPhone10,4": return "iPhone 8" case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus" case "iPhone10,3", "iPhone10,6": return "iPhone X" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad6,11", "iPad6,12": return "iPad 5" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4": return "iPad Pro 9.7 Inch" case "iPad6,7", "iPad6,8": return "iPad Pro 12.9 Inch" case "iPad7,1", "iPad7,2": return "iPad Pro 12.9 Inch 2. Generation" case "iPad7,3", "iPad7,4": return "iPad Pro 10.5 Inch" case "AppleTV5,3": return "Apple TV" case "AppleTV6,2": return "Apple TV 4K" case "AudioAccessory1,1": return "HomePod" default: return identifier } } }

Versión Swift 4.1:

public extension UIDevice { /// pares the deveice name as the standard name var modelName: String { #if targetEnvironment(simulator) let identifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"]! #else 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))) } #endif switch identifier { case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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 "iPhone9,1", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" case "iPhone8,4": return "iPhone SE" case "iPhone10,1", "iPhone10,4": return "iPhone 8" case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus" case "iPhone10,3", "iPhone10,6": return "iPhone X" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad6,11", "iPad6,12": return "iPad 5" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4": return "iPad Pro 9.7 Inch" case "iPad6,7", "iPad6,8": return "iPad Pro 12.9 Inch" case "iPad7,1", "iPad7,2": return "iPad Pro 12.9 Inch 2. Generation" case "iPad7,3", "iPad7,4": return "iPad Pro 10.5 Inch" case "AppleTV5,3": return "Apple TV" case "AppleTV6,2": return "Apple TV 4K" case "AudioAccessory1,1": return "HomePod" default: return identifier } } }

Está funcionando bien con Swift3.2 arriba:

let modelName = UIDevice.current.modelName


Otra alternativa más / simple (referencia de identificador de modelo que se encuentra en https://www.theiphonewiki.com/wiki/Models ):

Respuesta actualizada para Swift 3/4 que incluye el recorte de cadenas y el soporte del simulador

func modelIdentifier() -> String { if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { return simulatorModelIdentifier } var sysinfo = utsname() uname(&sysinfo) // ignore return value return String(bytes: Data(bytes: &sysinfo.machine, count: Int(_SYS_NAMELEN)), encoding: .ascii)!.trimmingCharacters(in: .controlCharacters) }

Respuesta original para Swift 2:

func modelIdentifier() -> String { var sysinfo = utsname() uname(&sysinfo) // ignore return value return NSString(bytes: &sysinfo.machine, length: Int(_SYS_NAMELEN), encoding: NSASCIIStringEncoding)! as String }


Tanto para el dispositivo como para los simuladores, cree un nuevo archivo swift con el nombre UIDevice.swift

Agregue el siguiente código

import UIKit public extension UIDevice { var modelName: String { #if (arch(i386) || arch(x86_64)) && os(iOS) let DEVICE_IS_SIMULATOR = true #else let DEVICE_IS_SIMULATOR = false #endif var machineString : String = "" if DEVICE_IS_SIMULATOR == true { if let dir = NSProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { machineString = dir } } else { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) machineString = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8 where value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } } switch machineString { case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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 "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,7", "iPad6,8": return "iPad Pro" case "AppleTV5,3": return "Apple TV" default: return machineString } } }

Luego en su controlador de vista,

let deviceType = UIDevice.currentDevice().modelName if deviceType.lowercaseString.rangeOfString("iphone 4") != nil { print("iPhone 4 or iphone 4s") } else if deviceType.lowercaseString.rangeOfString("iphone 5") != nil { print("iPhone 5 or iphone 5s or iphone 5c") } else if deviceType.lowercaseString.rangeOfString("iphone 6") != nil { print("iPhone 6 Series") }


Tratar con las estructuras es doloroso de forma rápida. Especialmente si tienen algún tipo de arrays en él. Aquí está mi solución: Continuar usando object-c. Simplemente cree una envoltura de clase object-c que haga este trabajo y luego use esa clase en swift. Aquí hay una clase de muestra que hace exactamente esto:

@interface DeviceInfo : NSObject + (NSString *)model; @end #import "DeviceInfo.h" #import <sys/utsname.h> @implementation DeviceInfo + (NSString *)model { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString: systemInfo.machine encoding: NSUTF8StringEncoding]; } @end

En el lado rápido:

let deviceModel = DeviceInfo.model()


SWIFT 3.1

Mis dos centavos por simplemente llamar a utsname:

func platform() -> String { var systemInfo = utsname() uname(&systemInfo) let size = Int(_SYS_NAMELEN) // is 32, but posix AND its init is 256.... let s = withUnsafeMutablePointer(to: &systemInfo.machine) {p in p.withMemoryRebound(to: CChar.self, capacity: size, {p2 in return String(cString: p2) }) } return s }

como otros lo hicieron, pero un poco más claro sobre toda la complejidad de C / Swift y la espalda. ):

Devuelve valores como "x86_64"


Swift 3.0 o superior

import UIKit class ViewController: UIViewController { let device = UIDevice.current override func viewDidLoad() { super.viewDidLoad() let model = device.model print(model) // e.g. "iPhone" let modelName = device.modelName print(modelName) // e.g. "iPhone 6" /* see the extension */ let deviceName = device.name print(deviceName) // e.g. "My iPhone" let systemName = device.systemName print(systemName) // e.g. "iOS" let systemVersion = device.systemVersion print(systemVersion) // e.g. "10.3.2" if let identifierForVendor = device.identifierForVendor { print(identifierForVendor) // e.g. "E1X2XX34-5X6X-7890-123X-XXX456C78901" } } }

y agrega la siguiente extensión

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))) } switch identifier { case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" 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 "iPhone9,1", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" case "iPhone8,4": return "iPhone SE" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad6,11", "iPad6,12": return "iPad 5" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4": return "iPad Pro 9.7 Inch" case "iPad6,7", "iPad6,8": return "iPad Pro 12.9 Inch" case "iPad7,1", "iPad7,2": return "iPad Pro 12.9 Inch 2. Generation" case "iPad7,3", "iPad7,4": return "iPad Pro 10.5 Inch" case "AppleTV5,3": return "Apple TV" case "i386", "x86_64": return "Simulator" default: return identifier } } }


Aquí una modificación sin forzar desenvolver y Swift 3.0:

import Foundation import UIKit public enum Model : String { case simulator = "simulator/sandbox", iPod1 = "iPod 1", iPod2 = "iPod 2", iPod3 = "iPod 3", iPod4 = "iPod 4", iPod5 = "iPod 5", iPad2 = "iPad 2", iPad3 = "iPad 3", iPad4 = "iPad 4", iPhone4 = "iPhone 4", iPhone4S = "iPhone 4S", iPhone5 = "iPhone 5", iPhone5S = "iPhone 5S", iPhone5C = "iPhone 5C", iPadMini1 = "iPad Mini 1", iPadMini2 = "iPad Mini 2", iPadMini3 = "iPad Mini 3", iPadAir1 = "iPad Air 1", iPadAir2 = "iPad Air 2", iPhone6 = "iPhone 6", iPhone6plus = "iPhone 6 Plus", iPhone6S = "iPhone 6S", iPhone6Splus = "iPhone 6S Plus", iPhoneSE = "iPhone SE", iPhone7 = "iPhone 7", iPhone7plus = "iPhone 7 Plus", unrecognized = "?unrecognized?" } public extension UIDevice { public var type: Model { var systemInfo = utsname() uname(&systemInfo) let modelCode = withUnsafePointer(to: &systemInfo.machine) { $0.withMemoryRebound(to: CChar.self, capacity: 1) { ptr in String.init(validatingUTF8: ptr) } } var modelMap : [ String : Model ] = [ "i386" : .simulator, "x86_64" : .simulator, "iPod1,1" : .iPod1, "iPod2,1" : .iPod2, "iPod3,1" : .iPod3, "iPod4,1" : .iPod4, "iPod5,1" : .iPod5, "iPad2,1" : .iPad2, "iPad2,2" : .iPad2, "iPad2,3" : .iPad2, "iPad2,4" : .iPad2, "iPad2,5" : .iPadMini1, "iPad2,6" : .iPadMini1, "iPad2,7" : .iPadMini1, "iPhone3,1" : .iPhone4, "iPhone3,2" : .iPhone4, "iPhone3,3" : .iPhone4, "iPhone4,1" : .iPhone4S, "iPhone5,1" : .iPhone5, "iPhone5,2" : .iPhone5, "iPhone5,3" : .iPhone5C, "iPhone5,4" : .iPhone5C, "iPad3,1" : .iPad3, "iPad3,2" : .iPad3, "iPad3,3" : .iPad3, "iPad3,4" : .iPad4, "iPad3,5" : .iPad4, "iPad3,6" : .iPad4, "iPhone6,1" : .iPhone5S, "iPhone6,2" : .iPhone5S, "iPad4,1" : .iPadAir1, "iPad4,2" : .iPadAir2, "iPad4,4" : .iPadMini2, "iPad4,5" : .iPadMini2, "iPad4,6" : .iPadMini2, "iPad4,7" : .iPadMini3, "iPad4,8" : .iPadMini3, "iPad4,9" : .iPadMini3, "iPhone7,1" : .iPhone6plus, "iPhone7,2" : .iPhone6, "iPhone8,1" : .iPhone6S, "iPhone8,2" : .iPhone6Splus, "iPhone8,4" : .iPhoneSE, "iPhone9,1" : .iPhone7, "iPhone9,2" : .iPhone7plus, "iPhone9,3" : .iPhone7, "iPhone9,4" : .iPhone7plus, ] guard let safeModelCode = modelCode else { return Model.unrecognized } guard let modelString = String.init(validatingUTF8: safeModelCode) else { return Model.unrecognized } guard let model = modelMap[modelString] else { return Model.unrecognized } return model } }


En Swift 3 sería

UIDevice.current.model


Forma simple de obtener el nombre del dispositivo con una línea de código

let name = ProcessInfo.init().environment["SIMULATOR_DEVICE_NAME"] ?? "NoN" print("My device name is: ", name)

Resultado del simulador de iPhone X -> El nombre de mi dispositivo es: iPhone X

Resultado en el área de juegos de Xcode 9.3.1 -> El nombre de mi dispositivo es: iPad Pro (9.7 pulgadas)


Si no desea seguir actualizando su código cada vez que Apple agregue un nuevo modelo a una familia de dispositivos, use el método a continuación para devolverle el código de modelo únicamente.

func platform() -> String { var systemInfo = utsname() uname(&systemInfo) let modelCode = withUnsafeMutablePointer(&systemInfo.machine) { ptr in String.fromCString(UnsafePointer<CChar>(ptr)) } return String.fromCString(modelCode!)! }


Utilizando Swift 3 (Xcode 8.3)

func deviceName() -> String { var systemInfo = utsname() uname(&systemInfo) let str = withUnsafePointer(to: &systemInfo.machine.0) { ptr in return String(cString: ptr) } return str }

Nota: De acuerdo con la respuesta oficial del foro de desarrolladores, es seguro usar tuplas de esta manera. La alineación de la memoria para la tupla Int8 grande será la misma que si fuera una gran matriz Int8. Es decir: contiguo y no acolchado.


Utilizando un Swift ''switch-case'':

func platformString() -> String { var devSpec: String switch platform() { case "iPhone1,2": devSpec = "iPhone 3G" case "iPhone2,1": devSpec = "iPhone 3GS" case "iPhone3,1": devSpec = "iPhone 4" case "iPhone3,3": devSpec = "Verizon iPhone 4" case "iPhone4,1": devSpec = "iPhone 4S" case "iPhone5,1": devSpec = "iPhone 5 (GSM)" case "iPhone5,2": devSpec = "iPhone 5 (GSM+CDMA)" case "iPhone5,3": devSpec = "iPhone 5c (GSM)" case "iPhone5,4": devSpec = "iPhone 5c (GSM+CDMA)" case "iPhone6,1": devSpec = "iPhone 5s (GSM)" case "iPhone6,2": devSpec = "iPhone 5s (GSM+CDMA)" case "iPhone7,1": devSpec = "iPhone 6 Plus" case "iPhone7,2": devSpec = "iPhone 6" case "iPod1,1": devSpec = "iPod Touch 1G" case "iPod2,1": devSpec = "iPod Touch 2G" case "iPod3,1": devSpec = "iPod Touch 3G" case "iPod4,1": devSpec = "iPod Touch 4G" case "iPod5,1": devSpec = "iPod Touch 5G" case "iPad1,1": devSpec = "iPad" case "iPad2,1": devSpec = "iPad 2 (WiFi)" case "iPad2,2": devSpec = "iPad 2 (GSM)" case "iPad2,3": devSpec = "iPad 2 (CDMA)" case "iPad2,4": devSpec = "iPad 2 (WiFi)" case "iPad2,5": devSpec = "iPad Mini (WiFi)" case "iPad2,6": devSpec = "iPad Mini (GSM)" case "iPad2,7": devSpec = "iPad Mini (GSM+CDMA)" case "iPad3,1": devSpec = "iPad 3 (WiFi)" case "iPad3,2": devSpec = "iPad 3 (GSM+CDMA)" case "iPad3,3": devSpec = "iPad 3 (GSM)" case "iPad3,4": devSpec = "iPad 4 (WiFi)" case "iPad3,5": devSpec = "iPad 4 (GSM)" case "iPad3,6": devSpec = "iPad 4 (GSM+CDMA)" case "iPad4,1": devSpec = "iPad Air (WiFi)" case "iPad4,2": devSpec = "iPad Air (Cellular)" case "iPad4,4": devSpec = "iPad mini 2G (WiFi)" case "iPad4,5": devSpec = "iPad mini 2G (Cellular)" case "iPad4,7": devSpec = "iPad mini 3 (WiFi)" case "iPad4,8": devSpec = "iPad mini 3 (Cellular)" case "iPad4,9": devSpec = "iPad mini 3 (China Model)" case "iPad5,3": devSpec = "iPad Air 2 (WiFi)" case "iPad5,4": devSpec = "iPad Air 2 (Cellular)" case "i386": devSpec = "Simulator" case "x86_64": devSpec = "Simulator" default: devSpec = "Unknown" } return devSpec }


A continuación se muestra el código para obtener la cadena de hardware, pero debe comparar estas cadenas de hardware para saber de qué dispositivo se trata. He creado una clase que contiene casi todas las cadenas de dispositivos (estamos manteniendo la cadena actualizada con los nuevos dispositivos). Es fácil de usar por favor revise

Swift : GitHub/DeviceGuru

Objective-C : GitHub/DeviceUtil

public func hardwareString() -> String { var name: [Int32] = [CTL_HW, HW_MACHINE] var size: Int = 2 sysctl(&name, 2, nil, &size, &name, 0) var hw_machine = [CChar](count: Int(size), repeatedValue: 0) sysctl(&name, 2, &hw_machine, &size, &name, 0) let hardware: String = String.fromCString(hw_machine)! return hardware }


Basado en esta answer y esta answer . He creado una gist públicagist

¿Cómo se puede utilizar?

let boolean: Bool = UIDevice.isDevice(ofType: .iPhoneX) // true or false let specificDevice: DeviceModel.Model = UIDevice.modelType // iPhone6s, iPhoneX, iPad etc... let model: DeviceModel = UIDevice.model // .simulator(let specificDevice), .real(let specificDevice), // .unrecognizedSimulator(let string), .unrecognized(let string) let modelName: String = UIDevice.model.name // iPhone 6, iPhone X, etc...

Este es el código dentro de la esencia.

public extension UIDevice { public static var modelCode: String { if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { return simulatorModelIdentifier } var systemInfo = utsname() uname(&systemInfo) return withUnsafeMutablePointer(to: &systemInfo.machine) { ptr in String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self)) } } public static var model: DeviceModel { // Thanks https://.com/a/26962452/5928180 var systemInfo = utsname() uname(&systemInfo) let modelCode = withUnsafeMutablePointer(to: &systemInfo.machine) { ptr in String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self)) } // Thanks https://.com/a/33495869/5928180 if modelCode == "i386" || modelCode == "x86_64" { if let simulatorModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"], let model = DeviceModel.Model(modelCode: simulatorModelCode) { return DeviceModel.simulator(model) } else if let simulatorModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { return DeviceModel.unrecognizedSimulator(simulatorModelCode) } else { return DeviceModel.unrecognized(modelCode) } } else if let model = DeviceModel.Model(modelCode: modelCode) { return DeviceModel.real(model) } else { return DeviceModel.unrecognized(modelCode) } } public static var modelType: DeviceModel.Model? { return UIDevice.model.model } public static func isDevice(ofType model: DeviceModel.Model) -> Bool { return UIDevice.modelType == model } } public enum DeviceModel { case simulator(Model) case unrecognizedSimulator(String) case real(Model) case unrecognized(String) public enum Model: String { case iPod1 = "iPod 1" case iPod2 = "iPod 2" case iPod3 = "iPod 3" case iPod4 = "iPod 4" case iPod5 = "iPod 5" case iPad2 = "iPad 2" case iPad3 = "iPad 3" case iPad4 = "iPad 4" case iPhone4 = "iPhone 4" case iPhone4S = "iPhone 4S" case iPhone5 = "iPhone 5" case iPhone5S = "iPhone 5S" case iPhone5C = "iPhone 5C" case iPadMini1 = "iPad Mini 1" case iPadMini2 = "iPad Mini 2" case iPadMini3 = "iPad Mini 3" case iPadAir1 = "iPad Air 1" case iPadAir2 = "iPad Air 2" case iPadPro9_7 = "iPad Pro 9.7/"" case iPadPro9_7_cell = "iPad Pro 9.7/" cellular" case iPadPro10_5 = "iPad Pro 10.5/"" case iPadPro10_5_cell = "iPad Pro 10.5/" cellular" case iPadPro12_9 = "iPad Pro 12.9/"" case iPadPro12_9_cell = "iPad Pro 12.9/" cellular" case iPhone6 = "iPhone 6" case iPhone6plus = "iPhone 6 Plus" case iPhone6S = "iPhone 6S" case iPhone6Splus = "iPhone 6S Plus" case iPhoneSE = "iPhone SE" case iPhone7 = "iPhone 7" case iPhone7plus = "iPhone 7 Plus" case iPhone8 = "iPhone 8" case iPhone8plus = "iPhone 8 Plus" case iPhoneX = "iPhone X" init?(modelCode: String) { switch modelCode { case "iPod1,1": self = .iPod1 case "iPod2,1": self = .iPod2 case "iPod3,1": self = .iPod3 case "iPod4,1": self = .iPod4 case "iPod5,1": self = .iPod5 case "iPad2,1": self = .iPad2 case "iPad2,2": self = .iPad2 case "iPad2,3": self = .iPad2 case "iPad2,4": self = .iPad2 case "iPad2,5": self = .iPadMini1 case "iPad2,6": self = .iPadMini1 case "iPad2,7": self = .iPadMini1 case "iPhone3,1": self = .iPhone4 case "iPhone3,2": self = .iPhone4 case "iPhone3,3": self = .iPhone4 case "iPhone4,1": self = .iPhone4S case "iPhone5,1": self = .iPhone5 case "iPhone5,2": self = .iPhone5 case "iPhone5,3": self = .iPhone5C case "iPhone5,4": self = .iPhone5C case "iPad3,1": self = .iPad3 case "iPad3,2": self = .iPad3 case "iPad3,3": self = .iPad3 case "iPad3,4": self = .iPad4 case "iPad3,5": self = .iPad4 case "iPad3,6": self = .iPad4 case "iPhone6,1": self = .iPhone5S case "iPhone6,2": self = .iPhone5S case "iPad4,1": self = .iPadAir1 case "iPad4,2": self = .iPadAir2 case "iPad4,4": self = .iPadMini2 case "iPad4,5": self = .iPadMini2 case "iPad4,6": self = .iPadMini2 case "iPad4,7": self = .iPadMini3 case "iPad4,8": self = .iPadMini3 case "iPad4,9": self = .iPadMini3 case "iPad6,3": self = .iPadPro9_7 case "iPad6,11": self = .iPadPro9_7 case "iPad6,4": self = .iPadPro9_7_cell case "iPad6,12": self = .iPadPro9_7_cell case "iPad6,7": self = .iPadPro12_9 case "iPad6,8": self = .iPadPro12_9_cell case "iPad7,3": self = .iPadPro10_5 case "iPad7,4": self = .iPadPro10_5_cell case "iPhone7,1": self = .iPhone6plus case "iPhone7,2": self = .iPhone6 case "iPhone8,1": self = .iPhone6S case "iPhone8,2": self = .iPhone6Splus case "iPhone8,4": self = .iPhoneSE case "iPhone9,1": self = .iPhone7 case "iPhone9,2": self = .iPhone7plus case "iPhone9,3": self = .iPhone7 case "iPhone9,4": self = .iPhone7plus case "iPhone10,1": self = .iPhone8 case "iPhone10,2": self = .iPhone8plus case "iPhone10,3": self = .iPhoneX case "iPhone10,6": self = .iPhoneX default: return nil } } } public var name: String { switch self { case .simulator(let model): return "Simulator[/(model.rawValue)]" case .unrecognizedSimulator(let s): return "UnrecognizedSimulator[/(s)]" case .real(let model): return model.rawValue case .unrecognized(let s): return "Unrecognized[/(s)]" } } public var model: DeviceModel.Model? { switch self { case .simulator(let model): return model case .real(let model): return model case .unrecognizedSimulator(_): return nil case .unrecognized(_): return nil } } }


Mi solución simple agrupada por dispositivo y soporte para nuevos dispositivos iPhone 8y iPhone Xen Swift 3:

public 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))) } switch identifier { case "iPhone3,1", "iPhone3,2", "iPhone3,3", "iPhone4,1": return "iPhone 4" case "iPhone5,1", "iPhone5,2", "iPhone5,3", "iPhone5,4", "iPhone6,1", "iPhone6,2", "iPhone8,4": return "iPhone 5" case "iPhone7,2", "iPhone8,1", "iPhone9,1", "iPhone9,3", "iPhone10,1", "iPhone10,4": return "iPhone 6,7,8" case "iPhone7,1", "iPhone8,2", "iPhone9,2", "iPhone9,4", "iPhone10,2", "iPhone10,5": return "iPhone Plus" case "iPhone10,3", "iPhone10,6": return "iPhone X" case "i386", "x86_64": return "Simulator" default: return identifier } } }

Y use:

switch UIDevice.current.modelName { case "iPhone 4": case "iPhone 5": case "iPhone 6,7,8": case "iPhone Plus": case "iPhone X": case "Simulator": default: }


Puede usar el marco de BDLocalizedDevicesModels para analizar la información del dispositivo y obtener el nombre.

Entonces simplemente llame UIDevice.currentDevice.productNameen su código.


extension UIDevice { public static let hardwareModel: String = { var path = [CTL_HW, HW_MACHINE] var n = 0 sysctl(&path, 2, nil, &n, nil, 0) var a: [UInt8] = .init(repeating: 0, count: n) sysctl(&path, 2, &a, &n, nil, 0) return .init(cString: a) }() } UIDevice.hardwareModel // → iPhone9,3


struct DeviceType { static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH < 568 static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 568 static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 667 static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 736 static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && Constants.SCREEN_MAX_LENGTH == 1024 }


struct utsname systemInfo; uname(&systemInfo); NSString* deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];


var platform: String? { var systemInfo = utsname() uname(&systemInfo) return withUnsafeMutablePointer(&systemInfo.machine) { ptr in String.fromCString(UnsafePointer<CChar>(ptr)) } }