web-dev-qa-db-ja.com

iPhoneまたはiPadで実行されているかどうかを判別するAPI

IPhoneとiPadのどちらで実行しているかを実行時にチェックするためのAPIはありますか?

私が考えることができる1つの方法は、使用することです:

[[UIDevice currentDevice] model];

そして、文字列@ "iPad"の存在を検出します-これは少し壊れやすいようです。

3.2 SDKでは、UIDeviceにも実際に探しているプロパティがありますが、3.2以前では機能しません(明らかに)。

[[UIDevice currentDevice] userInterfaceIdiom]; 

ユニバーサルアプリの@ "iPad"の存在を確認する以外の方法はありますか?

32
Eric

チェックアウト - UI_USER_INTERFACE_IDIOM

現在のデバイスでサポートされているインターフェイスイディオムを返します。

戻り値
UIUserInterfaceIdiomPhoneデバイスがiPhoneまたはiPod touchの場合、またはUIUserInterfaceIdiomPadデバイスがiPadの場合。

UIUserInterfaceIdiom

現在のデバイスで使用する必要があるインターフェースのタイプ

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
41
Andiih

参考までに:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

または#defineを使用します

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

ただし、コード全体でisPhoneを使用している場合、これは一般的に悪い習慣です。ファクトリパターンとポリモーフィズムを使用してifステートメントを含めたままにして、電話またはiPad用に作成されたオブジェクトを取得し、それらを使用して作業します。

追加

私はコード全体でこのソリューションを使用しています。標準のファクトリパターンをallocに追加します。

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

次に、私のallocは次のようになります。

+alloc { ALLOC_PER_DEVICE(); }

そして、電話バージョン用にTheClassPhoneというサブクラスを追加します。

注: Objective-Cには多重継承がないため、継承を使用して問題を解決するのは少し過大評価されています(つまり、サブクラスのサブクラスがある場合は機能しません)。必要なときに、良いifのようなものはありません。

15
Dan Rosenstark
  1. RespondsToSelector:を使用して、userInterfaceIdiomプロパティの存在を確認します。存在しない場合は、3.2より前のデバイスを使用しているため、iPadではありません。
  2. UserInterfaceIdiomが存在する場合は、それを使用します。

編集: ...これは明らかにUI_USER_INTERFACE_IDIOM()マクロとまったく同じなので、代わりにそれを使用します。 :)

1
Jakob Borg

次のコードを使用して、iPhoneまたはiPadでアプリを実行しているかどうかを確認できます。

- (NSString *)deviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *) platformString
{
    NSString *platform = [self deviceModel];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone_2G";
    else if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone_3G";
    else if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone_3GS";
    else if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone_4";
    else if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon_iPhone_4";
    else if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone_4S";
    else if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPod1,1"])      return @"iPod_Touch 1G";
    else if ([platform isEqualToString:@"iPod2,1"])      return @"iPod_Touch 2G";
    else if ([platform isEqualToString:@"iPod3,1"])      return @"iPod_Touch 3G";
    else if ([platform isEqualToString:@"iPod4,1"])      return @"iPod_Touch 4G";
    else if ([platform isEqualToString:@"iPad1,1"])           return @"iPad_1G";
    else if ([platform isEqualToString:@"iPad2,1"])      return @"iPad_2(WiFi)";
    else if ([platform isEqualToString:@"iPad2,2"])      return @"iPad_2(GSM)";
    else if ([platform isEqualToString:@"iPad2,3"])      return @"iPad_2(CDMA)";
    else if ([platform isEqualToString:@"iPad3,1"])      return @"iPad_3";
    else if ([platform isEqualToString:@"iPad3,2"])      return @"iPad_3(GSM/CDMA)";
    else if ([platform isEqualToString:@"iPad3,3"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad3,4"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad2,5"])      return @"iPad_mini_1G";
    else if ([platform isEqualToString:@"i386"])         return @"Simulator";
    else if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
1
Aragon
0
Jeff Kelley