Comment vérifier la compatibilité d'une application avec un iPhone X ou supérieur ?
Le système d'exploitation iOS a l'avantage par rapport à son concurrent Android de n'être exécuté que par un type bien précis de smartphone : les iPhone. Cela permet de gérer plus facilement la diversité des smartphones sur lequel l'application s'exécute. Il n'est cependant pas possible de connaître directement le smartphone qui exécute l'application. Il est nécessaire de passer par des tests.
Apple ne souhaite pas fournir aux développeurs de moyen direct de connaître l'appareil qui exécute l'application. Le but est d'éviter les cas spécifiques afin que les applications soient les plus universelles possible. Si un nouvel appareil iOS sort avec une nouvelle résolution, les applications ne devront ainsi pas être nécessairement adaptées. Apple fournit des interfaces de programmation et des guides de développement pour vous aider à éviter ces problèmes de conception : https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/.
Si vous souhaitez quand même détecter certains appareils, vous pouvez examiner la hauteur de l'écran de l'application. La variable stockant la hauteur évolue selon le langage de développement de votre application. Avec le langage Swift dans la version 3 ou une version plus récente, il faut utiliser la variable "UIScreen.main.nativeBounds.height". En Objective-C, on doit utiliser la propriété "[[UIScreen mainScreen] nativeBounds].size.height". Il sera nécessaire de la convertir en entier pour la comparer à d'autres nombres. Avec Xamarin, la hauteur de l'écran peut être obtenue avec l'instruction suivante :
int hauteur = UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale;
Pour l'iPhone X, il faut une hauteur égale à 2436. Faites cependant attention car il s'agit de la même valeur pour l'iPhone XR.
Un moyen plus simple pour détecter l'iPhone X est d'utiliser une fonction qui va déterminer le numéro de modèle du téléphone. C'est la méthode la plus sure et elle différencie l'iPhone X de l'iPhone XR. Il faut pour cela importer la librairie "sys/utsname.h". Voici la fonction qui retourne le nom du modèle en Objective-C. Il suffit ensuite d'interroger la valeur de retour de la fonction.
NSString* deviceName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; }
Il existe également la même possibilité en développant une extension avec le langage Swift (à partir de la version 3). Il faut après avoir inséré ce code utiliser la propriété "UIDevice.current.modelName".
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))) } return identifier } }
Il existe deux résultats pour l'iPhone X car il existe deux versions différentes, selon la norme de réseaux supportée par l'appareil : CDMA ou bien GSM. Les deux versions sont identifiables avec les valeurs "iPhone10,3" pour un iPhone X fonctionnant avec un réseau CDMA, "iPhone10,6" pour un réseau GSM.