¿Hay alguna forma 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, ¿alguien podría ayudarme con la forma equivalente de resolver esto en Swift?
Respuestas:
Hice esta extensión "puro 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 marco µ
DeviceKit
publicado en GitHub (también disponible a través de CocoaPods, Carthage y Swift Package Manager).Aquí está el código:
Lo llamas así:
Para dispositivos reales devuelve, por ejemplo, "iPad Pro 9.7 Inch", para simuladores devuelve "Simulador" + Identificador del simulador, por ejemplo, "Simulator iPad Pro 9.7 Inch"
fuente
Este ejemplo de Swift 3.0 devuelve el modelo de dispositivo actual como una
enum
constante (para evitar comparaciones directas con literales de cadena). El valor en bruto de la enumeraciónString
contiene el nombre del dispositivo iOS legible por humanos. Como es Swift, la lista de dispositivos reconocidos solo incluye modelos lo suficientemente recientes como para admitir versiones de iOS que incluyen Swift. El siguiente ejemplo de uso utiliza la implementación al final de esta respuesta:Su aplicación debe mantenerse actualizada para los nuevos lanzamientos de dispositivos y también cuando Apple agrega 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, por lo que sus algoritmos no fallarán inesperadamente al configurar o responder a un nuevo dispositivo. Puede consultar esta lista mantenida de números de modelo de dispositivo 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 Apple proporciona suelen ser los mecanismos más seguros y compatibles para adaptar dinámicamente el comportamiento de una aplicación a diferentes hardware. Sin embargo, el siguiente código puede ser útil para la creación de prototipos, la depuración, las pruebas o en cualquier momento en que el código necesite dirigirse a 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
fuente
modelMap
que hacen que iOS se queje:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. La solución alternativa puede ser decodificar CString primero y luego alimentar la cadena decodificada amodelMap
`if let (str, _) = String.decodeCString (modelCode, como: UTF8.self, repairingInvalidCodeUnits: false) {if let model = modelMap [str] {return model} } `if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
Swift 5.2.x, dispositivo y simulador actualizados a 2020
y el nuevo iPad Pro 11 " , iPad Air de tercera generación y iPad Pro 3 de generación , iPhone 11, 11 Pro y 11 Pro Max y iPhone SE de segunda generación .
Este método detecta el modelo correcto incluso si es un simulador. ( El nombre exacto del modelo de dispositivo simulador que se ejecuta en su simulador )
Uso : Simplemente puede obtener el modelo de dispositivo con:
o imprima la cadena exacta con:
Otro ejemplo con casos :
Para los modelos de dispositivos Apple, visite: https://www.theiphonewiki.com/wiki/Models
fuente
UIDevice().type.rawvalue
para obtener el nombre del dispositivo con espacios.UIDevice().type
, y si agrego.rawvalue
al final de eso, obtengo un error que dice: El valor del tipo 'Modelo' no tiene miembro 'rawvalue'rawvalue
, este ya no es necesario con Swift 5 , he actualizado esa línea. Ya probé el código y funciona correctamente, ¿qué tipo de dispositivo intentas probar? ¿Tienes otrasUIDevice
extensiones en tu prj?UIDevice
extensión aparte de la suya (alojada en un archivo dedicado dedicado).iPhone12,8
Otra alternativa más / simple (la referencia del identificador del modelo se encuentra en https://www.theiphonewiki.com/wiki/Models ):
Respuesta actualizada para Swift 3/4/5 que incluye recorte de cuerda y soporte de simulador:
fuente
Hice otra extensión de muestra en UIDevice para incluir una base de identificador de modelo de simulador en la respuesta de @ HAS . Funciona bien con Swift3.2 anterior (incluye Swift 4.x, Swift 5):
Nuevos modelos agregados: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
fuente
Tanto para el dispositivo como para los simuladores, cree un nuevo archivo rápido con el nombre UIDevice.swift
Agregue el siguiente código
Luego en su viewcontroller,
fuente
Tratar con estructuras c es doloroso a la velocidad. Especialmente si tienen algún tipo de matrices c en él. Aquí está mi solución: continuar usando el objetivo-c. Simplemente cree una clase wrapper object-c que haga este trabajo y luego use esa clase rápidamente. Aquí hay una clase de muestra que hace exactamente esto:
En el lado rápido:
fuente
x86_64
desdeutsname
es que el simulador es en realidad el equipo que tiene lamachine
propiedadx86_64
. Intente cambiar.machine
a.nodename
su método, el valor de retorno será algo asíMy-iMac.local
.Implementé una biblioteca súper liviana para detectar el dispositivo usado en base a algunas de las respuestas dadas: https://github.com/schickling/Device.swift
Se puede instalar a través de Cartago y se puede usar así:
fuente
Descubrí que muchas de estas respuestas usan cadenas. Decidí cambiar la respuesta de @HAS para usar una enumeración:
fuente
Usando Swift 3 (Xcode 8.3)
Nota: Según la respuesta oficial del foro de desarrollo, es seguro usar tuplas de esta manera. La alineación de la memoria para la gran tupla Int8 será la misma que si se tratara de una gran matriz Int8. es decir: contiguo y no acolchado.
fuente
Swift 5
fuente
¡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:
fuente
Swift 3.0 o superior
y agregue la siguiente extensión
fuente
Aquí una modificación sin forzar desenvolver y Swift 3.0:
fuente
Puede usar BDLocalizedDevicesModels marco para analizar la información del dispositivo y obtener el nombre.
Entonces solo llame
UIDevice.currentDevice.productName
su código.fuente
A continuación se muestra el código para obtener la cadena de hardware, pero debe comparar estas cadenas de hardware para saber qué dispositivo es. He creado una clase para eso que contiene casi todas las cadenas de dispositivos (mantenemos la cadena actualizada con nuevos dispositivos). Es fácil de usar, por favor verifique
Swift : GitHub / DeviceGuru
Objetivo-C : GitHub / DeviceUtil
fuente
Si no desea seguir actualizando su código cada vez que Apple agrega un nuevo modelo a una familia de dispositivos, utilice el siguiente método para devolverle solo el código del modelo.
fuente
SWIFT 3.1
mis dos centavos por simplemente llamar a utsname:
como lo hizo otro, pero un poco más limpio acerca de toda la complejidad de C / Swift y viceversa. ):
Devuelve valores como "x86_64"
fuente
Usando un 'switch-case' de Swift:
fuente
Mi solución simple agrupada por dispositivo y admite nuevos dispositivos
iPhone 8
yiPhone X
enSwift 3
:Y use:
fuente
Basado en esta respuesta y esta respuesta . He creado una esencia pública
Cómo se puede utilizar
Este es el código dentro de la esencia
fuente
La forma más sencilla de obtener el nombre del modelo (nombre de marketing)
Use la API privada con
-[UIDevice _deviceInfoForKey:]
cuidado, Apple no lo rechazará,¿Cómo obtuve la clave "marketing-name"?
Ejecutando en un simulador,
NSProcessInfo.processInfo.environment
contiene una clave llamada "SIMULATOR_CAPABILITIES", cuyo valor es un archivo plist. Luego abre el archivo plist, obtendrá la clave "nombre de marketing" del nombre del modelo.fuente
En Swift 3 sería
fuente
fuente
fuente
Hay una biblioteca auxiliar para esto.
Swift 5
Swift 4.0 - Swift 4.2
si solo quieres determinar el modelo y hacer algo en consecuencia.
Puedes usar así:
En una función:
fuente
fuente