One of my apps connects to a web app service that delivers device specific news to to the user. To adapt this to the latest iPhone versions I need to programmatically distinguish between the iPhone XS and iPhone X. How can this be done?
[[UIScreen mainScreen] bounds].size
was always a good starting point to tell the different devices apart. However, iPhone XS and iPhone X have the same screen dimensions: 1125 x 2436. Thus using [[UIScreen mainScreen] bounds].size
does not work in this case.
Is there any other method to detect the latest iPhone versions?
EDIT: This is NOT a duplicate of the question "How to detected iPhone X" since all answers/solutions discussed there use the screen dimensions to specify the device type. As described above iPhone X and iPhone XS have the exact same dimensions and thus the solutions cannot tell these two apart...
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With