デバイスがiPhone Xであるかどうかを検出する [iOS]

このエントリーをはてなブックマークに追加

質問:

僕のiOSアプリケーションは UINavigationBarの高さ情報を使ってるんだけど、新しいiPhone Xだと問題が起こりそうなんだ。

誰かiPhone X上でアプリが実行されているかどうかを自動検出する信頼できる方法って知ってる(Objectiv-Cで)?

編集:

もちろん、画面のサイズをチェックすることは可能だけど、iOSを検出するために使うTARGET_OS_IPHONEみたいなビルトイン・メソッドって無いかな、、、?

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}

By Andrei Herford | 質問日時: 2017年9月13日 8:12



回答1:

答えから言うとNo、直接的に検出する方法はないよ。もっと詳細が知りたければこことか
ここを参照。

もしiPhoneの高さの検出を検出したいなら、2436pxを使うべき

デバイス画面のサイズと向き

Vqsic.png

Switft3以上

if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 1136:
print("iPhone 5 or 5S or 5C")
case 1334:
print("iPhone 6/6S/7/8")
case 2208:
print("iPhone 6+/6S+/7+/8+")
case 2436:
print("iPhone X")
default:
print("unknown")
}
}

Objective C

if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {
switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) {
case 1136:
printf("iPhone 5 or 5S or 5C");
break;
case 1334:
printf("iPhone 6/6S/7/8");
break;
case 2208:
printf("iPhone 6+/6S+/7+/8+");
break;
case 2436:
printf("iPhone X");
break;
default:
printf("unknown");
}
}

それかscreenSize.heightをint型の812でなくfloat型の812.0fとして使用するとか

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812.0f)
NSLog(@"iPhone X");
}

詳細についてはこちら.

更新

デバイスタイプを識別するために userInterfaceIdiomプロパティを使うべきじゃない。iPhoneアプリはiPadにもインストールできるので、その場合、userInterfaceIdiomはUIUserInterfaceIdiomPhoneを返してしまうから。

適切な方法は、 unameを使ってマシン名を取得すること。このスレッドを参照してみて。

By Anbu.Karthik | 回答日時: 2017年9月13日 8:41



回答2:

もう一つの方法はこんなの。これは今のところiPhone Xだけが上部にノッチを持ったデバイスだから動くんだけど。
僕が使ってる方法は:

iphoneX = NO;
if (@available(iOS 11.0, *)) {
if (_window.safeAreaInsets.top > 0.0) {
iphoneX = YES;
}
}

もちろん、横向きでの場合は左右のセーフエリアのインセットをチェックする必要があるかも。

編集:_windowはAppDelegateのUIWindowで、このチェックはアプリケーションdidFinishLaunchingWithOptionsの中で行われる。

By saswanb | 回答日時: 2017年9月14日 19:50



回答3:

デバイスモデル/マシン名をチェックして。コードの中でポイントやピクセル数を使わないで!
それはハードコードだから!

#import <sys/utsname.h> // import it in your header or implementation file.
NSString* deviceName()
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
}

結果:

@"iPhone10,3" on iPhone X (CDMA)
@"iPhone10,6" on iPhone X (GSM)

この回答を参照。

By Itachi | 回答日時: 2017年9月20日 7:51



Source: Detect if the device is iPhone X

共有 コメント