Cómo determinar el modelo de iPhone en Swift: análisis para principiantes
\n\n¿Alguna vez te has preguntado por qué tu aplicación en Swift funciona perfectamente en un iPhone 13, pero en un iPhone SE (segunda generación) se ve como si la hubieran dibujado a toda prisa? ¿O por qué algunas funciones que agregaste de repente no están disponibles en modelos antiguos? La respuesta es simple: diferentes iPhones tienen diferentes capacidades, desde el tamaño de la pantalla hasta la presencia de Face ID y la retroalimentación háptica.
\n\nEn este artículo, analizaremos cómo determinar el modelo de iPhone en Swift, desde el método simple con UIDevice hasta el enfoque profesional con sysctlbyname. Aprenderás no solo a obtener "iPhone", sino a saber exactamente si tienes un iPhone 14 Pro Max o un iPhone 8. ¡Allá vamos!
\n\n¿Por qué es importante?
\nTodo desarrollador de iOS, tarde o temprano, se enfrenta a la necesidad de adaptar la interfaz o la lógica a un dispositivo específico. Aquí hay algunos escenarios reales:
\n- \n
- Diseño adaptable: en iPhones con "muesca" (iPhone X y posteriores), los elementos deben colocarse de manera diferente que en los modelos antiguos con botón de inicio. \n
- Optimización del rendimiento: en dispositivos antiguos (iPhone 6s, iPhone 7), vale la pena desactivar animaciones o efectos pesados. \n
- Limitaciones funcionales: no todos los modelos son compatibles con ARKit, LiDAR, pantalla de 120 Hz o MagSafe. \n
- Analítica: comprender qué modelos utilizan tus usuarios ayuda a tomar decisiones de producto. \n
Nivel 1: UIDevice (simple, pero limitado)
\nLa forma más sencilla es usar la clase incorporada UIDevice. Devuelve información general sobre el dispositivo, pero, desafortunadamente, no muestra el modelo exacto.
import UIKit\n\nlet device = UIDevice.current\nprint("Nombre del dispositivo: \\(device.name)")\nprint("Modelo: \\(device.model)") // "iPhone" o "iPad"\nprint("Sistema: \\(device.systemName)") // "iOS"\nprint("Versión: \\(device.systemVersion)") // "17.0"\n\n\nLo que obtendrás: device.model devolverá simplemente "iPhone" o "iPad". Esto es útil para saber que es un dispositivo móvil, pero no para una identificación precisa.
Cuándo usarlo: si solo necesitas verificar que la aplicación se ejecuta en un iPhone y no en un iPad o iPod touch. Por ejemplo, para ocultar funciones específicas de iPad.
\n\nNivel 2: sysctlbyname (enfoque profesional)
\nPara obtener el modelo exacto de iPhone, debes recurrir a la llamada del sistema sysctlbyname. Devuelve una cadena como "iPhone14,2" (que es el iPhone 13 Pro). Conociendo estos identificadores, puedes asignarlos a nombres legibles por humanos.
Aquí está el código funcional en Swift:
\n\nimport UIKit\n\nfunc getDeviceModelCode() -> String {\n var size = 0\n sysctlbyname("hw.machine", nil, &size, nil, 0)\n var machine = [CChar](repeating: 0, count: size)\n sysctlbyname("hw.machine", &machine, &size, nil, 0)\n return String(cString: machine)\n}\n\n// Uso\nlet modelCode = getDeviceModelCode()\nprint("Código del modelo: \\(modelCode)") // Por ejemplo: "iPhone14,2"\n\n\nAhora tienes "iPhone14,2". ¿Pero qué modelo es? Necesitarás un diccionario de correspondencias.
Diccionario de modelos de iPhone (actualizado a 2024)
\nA continuación se muestra una lista incompleta, pero suficiente para la mayoría de las tareas. La lista completa se puede encontrar en fuentes abiertas o mantenerla como un archivo separado.
\n\nfunc getDeviceModelName() -> String {\n let modelCode = getDeviceModelCode()\n \n let modelMap: [String: String] = [\n // Serie iPhone 15\n "iPhone15,4": "iPhone 15",\n "iPhone15,5": "iPhone 15 Plus",\n "iPhone16,1": "iPhone 15 Pro",\n "iPhone16,2": "iPhone 15 Pro Max",\n \n // Serie iPhone 14\n "iPhone14,7": "iPhone 14