Quand le code fonctionne sur le simulateur mais plante sur un appareil réel : comprendre UI_USER_INTERFACE_IDIOM() en Swift
\n\nAvez-vous déjà écrit une application qui semble parfaite sur le simulateur iPhone 14 Pro, mais qui devient un désordre sur un iPad Mini ? Ou l’inverse — votre interface iPad élégante se déforme sur un vieil iPod touch ? Une douleur familière, n’est-ce pas ?
\n\nLes développeurs iOS rencontrent souvent le besoin de savoir sur quel appareil l’application est lancée. Cela semble simple, non ? Mais le diable se cache dans les détails. La célèbre question Stack Overflow sur UI_USER_INTERFACE_IDIOM() a accumulé des milliers de vues, ce qui montre que même les programmeurs expérimentés se perdent parfois dans les nuances.
Dans cet article, nous allons détailler tout ce qu’il faut savoir sur la détection d’appareil en Swift. Pas de blabla — seulement de la pratique, des exemples concrets et des réponses aux questions les plus fréquentes.
\n\nQu’est-ce que UI_USER_INTERFACE_IDIOM() et pourquoi en parle-t-on ?
\n\nC’est une bonne vieille fonction de l’époque de l’Objective-C. Elle retourne une valeur de type UIUserInterfaceIdiom, qui indique le type d’appareil : iPhone, iPad, TV ou CarPlay.
Voici à quoi cela ressemblait en Objective-C classique :
\n\nif (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {\n // C’est un iPad\n} else {\n // C’est un iPhone ou un iPod touch\n}\n\nMais Swift est un langage plus strict et plus sûr. L’utilisation directe de cette fonction C n’est pas toujours pratique. Une approche plus moderne via UIDevice.current a pris le relais.
Comment détecter correctement un appareil en Swift : deux méthodes fonctionnelles
\n\nMéthode n°1 — la classique via UIDevice (recommandée) :
import UIKit\n\nlet deviceIdiom = UIDevice.current.userInterfaceIdiom\n\nswitch deviceIdiom {\ncase .phone:\n print("C’est un iPhone ou un iPod touch")\ncase .pad:\n print("C’est un iPad")\ncase .tv:\n print("C’est une Apple TV")\ncase .carPlay:\n print("C’est CarPlay")\ncase .mac:\n print("C’est Mac Catalyst ou un Mac")\n@unknown default:\n print("Appareil inconnu (peut-être futur)")\n}\n\nImportant : Le cas .mac est apparu dans iOS 14+. Si votre application prend en charge des versions plus anciennes, utilisez @unknown default pour gérer les types futurs.
Méthode n°2 — compatibilité avec le code Objective-C (si nécessaire) :
\n\nif UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {\n print("Nous travaillons sur un téléphone")\n}\n\nLes deux options sont correctes, mais la première est plus idiomatique pour Swift.
\n\nQuestions fréquentes et pièges courants
\n\n1. Pourquoi sur iPad mini détecte-t-on un iPhone ?
\n\nC’est la question la plus courante. Vous lancez l’application sur un iPad mini, et userInterfaceIdiom retourne obstinément .phone. Quel est le problème ?
La réponse est simple et peu évidente : le mode d’échelle (Scale Mode). Si dans les paramètres de votre application (Target → General → Deployment Info) le mode "iPhone" est sélectionné, même sur un iPad physique, le système émule un iPhone.
\n\nSolution : vérifiez les paramètres du projet.
\n- \n
- Allez dans Target de votre application \n
- General → Deployment Info \n
- Devices : sélectionnez "Universal" (si l’application doit fonctionner sur tous les appareils) \n
Si vous avez choisi "iPhone Only", l’application fonctionnera sur iPad en mode compatibilité (comme sur un grand iPhone), et idiom sera .phone.
2. Comment distinguer un iPhone d’un iPod touch ?
\n\nUI_USER_INTERFACE_IDIOM() ne fait pas la différence entre iPhone et iPod touch — les deux retournent .phone. Pour une détection précise du modèle, utilisez UIDevice.current.model ou modelName via sysctl.
Exemple d’extension pour obtenir le nom exact du modèle :
\n\nimport UIKit\n\nextension UIDevice {\