Comment déterminer le modèle d'iPhone en Swift : analyse pour débutants
\n\nAvez-vous déjà réfléchi à la raison pour laquelle votre application Swift fonctionne parfaitement sur un iPhone 13, mais sur un iPhone SE (de deuxième génération) elle a l'air d'avoir été dessinée à la hâte ? Ou pourquoi certaines fonctionnalités que vous avez ajoutées sont soudainement indisponibles sur les anciens modèles ? La réponse est simple : différents iPhone ont des capacités différentes — de la taille de l'écran à la présence de Face ID et du retour haptique.
\n\nDans cet article, nous allons voir comment déterminer le modèle d'iPhone en Swift — de la méthode simple avec UIDevice à l'approche professionnelle avec sysctlbyname. Vous apprendrez non seulement à obtenir "iPhone", mais à savoir exactement s'il s'agit d'un iPhone 14 Pro Max ou d'un iPhone 8. C'est parti !
\n\nPourquoi est-ce important ?
\nChaque développeur iOS est tôt ou tard confronté à la nécessité d'adapter l'interface ou la logique à un appareil spécifique. Voici quelques scénarios réels :
\n- \n
- Design adaptatif : sur les iPhone avec "encoche" (iPhone X et plus récents), les éléments doivent être disposés différemment que sur les anciens modèles avec bouton Home. \n
- Optimisation des performances : sur les anciens appareils (iPhone 6s, iPhone 7), il est conseillé de désactiver les animations ou effets lourds. \n
- Limitations fonctionnelles : tous les modèles ne prennent pas en charge ARKit, LiDAR, l'écran 120 Hz ou MagSafe. \n
- Analytique : comprendre quels modèles vos utilisateurs utilisent aide à prendre des décisions produit. \n
Niveau 1 : UIDevice (simple mais limité)
\nLa méthode la plus simple consiste à utiliser la classe intégrée UIDevice. Elle renvoie des informations générales sur l'appareil, mais malheureusement, elle n'affiche pas le modèle exact.
import UIKit\n\nlet device = UIDevice.current\nprint("Nom de l'appareil : \\(device.name)")\nprint("Modèle : \\(device.model)") // "iPhone" ou "iPad"\nprint("Système : \\(device.systemName)") // "iOS"\nprint("Version : \\(device.systemVersion)") // "17.0"\n\n\nCe que vous obtiendrez : device.model renverra simplement "iPhone" ou "iPad". C'est utile pour comprendre qu'il s'agit d'un appareil mobile, mais pas pour une identification précise.
Quand l'utiliser : si vous avez seulement besoin de vérifier que l'application est exécutée sur un iPhone, et non sur un iPad ou un iPod touch. Par exemple, pour masquer des fonctionnalités spécifiques à l'iPad.
\n\nNiveau 2 : sysctlbyname (approche professionnelle)
\nPour obtenir le modèle exact d'iPhone, vous devez utiliser l'appel système sysctlbyname. Il renvoie une chaîne de caractères comme "iPhone14,2" (c'est l'iPhone 13 Pro). Connaissant ces identifiants, vous pouvez les associer à des noms lisibles par l'homme.
Voici le code fonctionnel 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// Utilisation\nlet modelCode = getDeviceModelCode()\nprint("Code du modèle : \\(modelCode)") // Exemple : "iPhone14,2"\n\n\nVous avez maintenant "iPhone14,2". Mais de quel modèle s'agit-il ? Vous aurez besoin d'un dictionnaire de correspondances.
Dictionnaire des modèles d'iPhone (à jour en 2024)
\nVoici une liste non exhaustive mais suffisante pour la plupart des tâches. La liste complète peut être trouvée dans des sources ouvertes ou maintenue dans un fichier séparé.
\n\nfunc getDeviceModelName() -> String {\n let modelCode = getDeviceModelCode()\n \n let modelMap: [String: String] = [\n // Série 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 // Série iPhone 14\n "iPhone14,7": "iPhone 14