用于确定是在iPhone还是iPad上运行的API

时间:2010-05-21 18:00:28

标签: iphone objective-c cocoa-touch ipad uidevice

是否有用于在运行时检查您是在iPhone还是iPad上运行的API?

我能想到的一种方法是使用:

[[UIDevice currentDevice] model];

并检测字符串@“iPad”的存在 - 这看起来有点脆弱。

在3.2 SDK中,我看到UIDevice也有一个我正在寻找的属性,但不适用于3.2之前(显然):

[[UIDevice currentDevice] userInterfaceIdiom]; 

除了检查通用应用程序是否存在@“iPad”之外还有其他方法吗?

5 个答案:

答案 0 :(得分:41)

结帐UI_USER_INTERFACE_IDIOM

  

返回当前设备支持的接口习惯用法。

     

返回值
  如果设备是iPhone或iPod touch,则UIUserInterfaceIdiomPhone;如果设备是iPad,则为UIUserInterfaceIdiomPad

     

UIUserInterfaceIdiom

     

应在当前设备上使用的接口类型

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;

答案 1 :(得分:15)

仅供我参考:

@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\

然后我的allocs看起来像这样:

+alloc { ALLOC_PER_DEVICE(); }

我为手机版添加了一个名为TheClassPhone的子类。

注意:由于Objective-C中没有多重继承,因此使用继承来解决您的问题有点过高(即,如果您有子类的子类,它就不起作用)。

。当你需要它时,没有什么比好if更好。

答案 2 :(得分:1)

  1. 使用respondsToSelector:检查是否存在userInterfaceIdiom属性。如果它不存在,我们使用3.2之前的设备,因此不是iPad。
  2. 如果userInterfaceIdiom存在,请使用它。
  3. 编辑: ...这显然正是UI_USER_INTERFACE_IDIOM()宏所做的,所以请改用它。 :)

答案 3 :(得分:1)

您可以使用以下代码检查您是否在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;
}

答案 4 :(得分:0)