How to programmatically detect iPhone XS or iPhone X?
You can determine using 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, IPHONE 11 PRO")
case 2688:
print("IPHONE XS MAX, IPHONE 11 PRO MAX")
case 1792:
print("IPHONE XR, IPHONE 11")
default:
print("UNDETERMINED")
}
}
.nativeBounds
won't change even if the orientation is changed.
https://developer.apple.com/documentation/uikit/uiscreen/1617810-nativebounds
I use DeviceUtil to determine an iOS device's model.
According to this DeviceUtil GitHub post, the returned UIDevice hardwareString values are:
iPhone11,2 = iPhone XS
iPhone11,4 = iPhone XS Max
iPhone11,8 = iPhone XR
Curiously, the Xcode 10 GM Simulator's [UIScreen mainScreen].bounds.size returns 375 x 812 for iPhone X, XS, XS Max, and R devices. I had expected 414 x 896 for the XS Max and XR.
#import <sys/utsname.h>
// import it in your header or implementation file.
+(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;
}
It will return device model for you ,also included 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"]
Note:- Be careful, it works fine only for portrait orientation