如何以编程方式检测iPhone XS或iPhone X?

And*_*ord 4 iphone objective-c ios iphone-x iphone-xs

我的一个应用程序连接到Web应用程序服务,该服务向用户提供特定于设备的新闻.为了适应最新的iPhone版本,我需要以编程方式区分iPhone XS和iPhone X.如何做到这一点?

[[UIScreen mainScreen] bounds].size总是一个很好的起点,告诉不同的设备分开.但是,iPhone XS和iPhone X具有相同的屏幕尺寸:1125 x 2436.因此[[UIScreen mainScreen] bounds].size在这种情况下使用不起作用.

还有其他方法可以检测最新的iPhone版本吗?

编辑:不是 "如何检测iPhone X"的问题的重复,因为那里讨论的所有答案/解决方案都使用屏幕尺寸来指定设备类型.如上所述,iPhone X和iPhone XS具有完全相同的尺寸,因此解决方案无法区分这两者......

小智 19

您可以确定使用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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

.nativeBounds即使方向改变,也不会改变. https://developer.apple.com/documentation/uikit/uiscreen/1617810-nativebounds


lif*_*joy 9

我使用DeviceUtil来确定iOS设备的型号.

根据这个DeviceUtil GitHub帖子,返回的UIDevice hardwareString值是:

iPhone11,2 = iPhone XS
iPhone11,4 = iPhone XS Max
iPhone11,8 = iPhone XR
Run Code Online (Sandbox Code Playgroud)

奇怪的是,Xcode 10 GM Simulator的[UIScreen mainScreen] .bounds.size为iPhone X,XS,XS Max和R设备返回375 x 812.我原本预计XS Max和XR会有414 x 896.