Une de mes applications se connecte à un service d'applications Web qui fournit à l'utilisateur des informations spécifiques à l'appareil. Pour adapter cela aux dernières versions de l'iPhone, je dois faire la distinction par programme entre l'iPhone XS et l'iPhone X. Comment cela peut-il être fait?
[[UIScreen mainScreen] bounds].size
a toujours été un bon point de départ pour distinguer les différents appareils. Cependant, l'iPhone XS et l'iPhone X ont les mêmes dimensions d'écran: 1125 x 2436. L'utilisation de [[UIScreen mainScreen] bounds].size
ne fonctionne donc pas dans ce cas.
Existe-t-il une autre méthode pour détecter les dernières versions de l'iPhone?
EDIT: Ceci est PAS un double de la question "Comment détecter un iPhone X" puisque toutes les réponses/solutions présentées utilisent les dimensions de l'écran pour spécifier le type d'appareil. Comme décrit ci-dessus, iPhone X et iPhone XS ont exactement les mêmes dimensions et les solutions ne peuvent donc pas les distinguer ...
J'utilise DeviceUtil pour déterminer le modèle d'un périphérique iOS.
Selon cette DeviceUtil GitHub post , les valeurs UIDevice hardwareString renvoyées sont les suivantes:
iPhone11,2 = iPhone XS
iPhone11,4 = iPhone XS Max
iPhone11,8 = iPhone XR
Curieusement, le Xcode 10 GM du [UIScreen mainScreen] du simulateur .bounds.size renvoie 375 x 812 pour les appareils iPhone X, XS, XS Max et R. Je m'attendais à 414 x 896 pour les XS Max et XR.
Vous pouvez déterminer en utilisant UIScreen.main.nativeBounds
.
if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 1136:
print("IPHONE 5,5S,5C")
case 1334:
print("IPHONE 6,7,8 IPHONE 6S,7S,8S ")
case 1920, 2208:
print("IPHONE 6PLUS, 6SPLUS, 7PLUS, 8PLUS")
case 2436:
print("IPHONE X, IPHONE XS")
case 2688:
print("IPHONE XS_MAX")
case 1792:
print("IPHONE XR")
default:
print("UNDETERMINED")
}
}
.nativeBounds
ne changera pas même si l'orientation est modifiée . https://developer.Apple.com/documentation/uikit/uiscreen/1617810-nativebounds
#import <sys/utsname.h>
// importez-le dans votre en-tête ou votre fichier d'implémentation.
+(NSString*)deviceName
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *machineName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSDictionary *commonNamesDictionary =
@{
@"i386": @"i386 Simulator",
@"x86_64": @"x86_64 Simulator",
@"iPhone1,1": @"iPhone",
@"iPhone1,2": @"iPhone 3G",
@"iPhone2,1": @"iPhone 3GS",
@"iPhone3,1": @"iPhone 4",
@"iPhone3,2": @"iPhone 4",
@"iPhone3,3": @"iPhone 4",
@"iPhone4,1": @"iPhone 4S",
@"iPhone5,1": @"iPhone 5",
@"iPhone5,2": @"iPhone 5",
@"iPhone5,3": @"iPhone 5c",
@"iPhone5,4": @"iPhone 5c",
@"iPhone6,1": @"iPhone 5s",
@"iPhone6,2": @"iPhone 5s",
@"iPhone7,1": @"iPhone 6+",
@"iPhone7,2": @"iPhone 6",
@"iPhone8,1": @"iPhone 6S",
@"iPhone8,2": @"iPhone 6S+",
@"iPhone8,4": @"iPhone SE",
@"iPhone9,1": @"iPhone 7",
@"iPhone9,2": @"iPhone 7+",
@"iPhone9,3": @"iPhone 7",
@"iPhone9,4": @"iPhone 7+",
@"iPhone10,1": @"iPhone 8",
@"iPhone10,2": @"iPhone 8+",
@"iPhone10,3": @"iPhone X",
@"iPhone11,2": @"iPhone XS",
@"iPhone11,4": @"iPhone XS Max",
@"iPhone11,8": @"iPhone XR",
@"iPad1,1": @"iPad",
@"iPad2,1": @"iPad 2",
@"iPad2,2": @"iPad 2",
@"iPad2,3": @"iPad 2",
@"iPad2,4": @"iPad 2",
@"iPad2,5": @"iPad Mini 1G",
@"iPad2,6": @"iPad Mini 1G",
@"iPad2,7": @"iPad Mini 1G",
@"iPad3,1": @"iPad 3",
@"iPad3,2": @"iPad 3",
@"iPad3,3": @"iPad 3",
@"iPad3,4": @"iPad 4",
@"iPad3,5": @"iPad 4",
@"iPad3,6": @"iPad 4",
@"iPad4,1": @"iPad Air",
@"iPad4,2": @"iPad Air",
@"iPad4,3": @"iPad Air",
@"iPad5,3": @"iPad Air 2",
@"iPad5,4": @"iPad Air 2",
@"iPad4,4": @"iPad Mini 2G",
@"iPad4,5": @"iPad Mini 2G",
@"iPad4,6": @"iPad Mini 2G",
@"iPad4,7": @"iPad Mini 3G",
@"iPad4,8": @"iPad Mini 3G",
@"iPad4,9": @"iPad Mini 3G",
@"iPod1,1": @"iPod 1st Gen",
@"iPod2,1": @"iPod 2nd Gen",
@"iPod3,1": @"iPod 3rd Gen",
@"iPod4,1": @"iPod 4th Gen",
@"iPod5,1": @"iPod 5th Gen",
@"iPod7,1": @"iPod 6th Gen",
};
NSString *deviceName = commonNamesDictionary[machineName];
if (deviceName == nil) {
deviceName = machineName;
}
return deviceName;
}
Il renverra le modèle de périphérique pour vous, également inclus XS, XR, XS Max
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
#define IS_IPHONE_XS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
#define IS_IPHONE_X_MAX (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 896.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0) // 3.0 for iPhone X, 2.0 for others
#define IS_IPAD_DEVICE [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"]
Remarque: - Faites attention, cela ne fonctionne bien que pour l'orientation portrait