私のアプリの1つは、デバイス固有のニュースをユーザーに配信するWebアプリサービスに接続します。これを最新のiPhoneバージョンに適合させるには、プログラムでiPhone XSとiPhone Xを区別する必要があります。これを行うにはどうすればよいですか?
[[UIScreen mainScreen] bounds].size
は常に、さまざまなデバイスを区別するための良い出発点でした。ただし、iPhone XSとiPhone Xの画面サイズは同じです:1125 x2436。したがって、[[UIScreen mainScreen] bounds].size
はこの場合機能しません。
最新のiPhoneバージョンを検出する他の方法はありますか?
編集:これは重複ではありません「iPhone Xを検出する方法」の質問です。そこで説明されているすべての回答/解決策では、画面の寸法を使用してデバイスタイプを指定しています。上記のように、iPhone XとiPhone XSの寸法はまったく同じであるため、ソリューションではこれら2つを区別できません...
DeviceUtil を使用して、iOSデバイスのモデルを決定します。
この DeviceUtil GitHub post によると、返されるUIDevice hardwareString値は次のとおりです。
iPhone11,2 = iPhone XS
iPhone11,4 = iPhone XS Max
iPhone11,8 = iPhone XR
奇妙なことに、Xcode 10 GM Simulator's [UIScreen mainScreen] .bounds.sizeは、iPhone X、XS、XS Max、およびRデバイスに対して375 x 812を返します。XSに対して414 x 896と予期していましたマックスとXR。
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
は、向きを変更しても変更されません。 https://developer.Apple.com/documentation/uikit/uiscreen/1617810-nativebounds
#import <sys/utsname.h>
//ヘッダーまたは実装ファイルにインポートします。
+(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;
}
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"]
注:-注意してください。縦向きの場合のみ機能します