代码之家  ›  专栏  ›  技术社区  ›  Eric

用于确定是否在iPhone或iPad上运行的API[重复]

  •  32
  • Eric  · 技术社区  · 14 年前

    这个问题已经有了答案:

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

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

    [[UIDevice currentDevice] model];
    

    检测一下“ipad”这个看起来有点脆弱的字符串的存在。

    在3.2 SDK中,我看到了 UIDevice 也有一个属性,这是我真正想要的,但不适用于3.2之前的版本(显然):

    [[UIDevice currentDevice] userInterfaceIdiom]; 
    

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

    5 回复  |  直到 10 年前
        1
  •  41
  •   Jeroen Vannevel luciomrx    10 年前

    结帐 UI_USER_INTERFACE_IDIOM .

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

    返回值
    UIUserInterfaceIdiomPhone 如果设备是iPhone或iPod touch或 UIUserInterfaceIdiomPad 如果设备是iPad。

    UIUserInterfaceIdiom

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

    typedef enum {
       UIUserInterfaceIdiomPhone,
       UIUserInterfaceIdiomPad,
    } UIUserInterfaceIdiom;
    
        2
  •  15
  •   Martin    10 年前

    仅供参考:

    @property (nonatomic, readonly) BOOL isPhone;
    
    -(BOOL)isPhone {
        return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
    }
    

    或使用定义

    #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_PER_DEVICE(); }
    

    我添加了一个名为 TheClassPhone 对于电话版本。

    注: 由于在Objective-C中没有多重继承,使用继承来解决问题有点被高估了(即,如果您有子类的子类,它就不起作用)。没有什么比得上好的了 如果 当你需要的时候。

        3
  •  1
  •   Jakob Borg    14 年前
    1. 使用respondstoselector:检查是否存在userInterfaceIDiom属性。如果它不存在,我们使用的是3.2之前的设备,而不是iPad。
    2. 如果存在userInterfaceIDiom,请使用它。

    编辑: …很明显,这正是ui_user_interface_adily()宏所做的,所以使用它来代替。:)

        4
  •  1
  •   Ahmed Hammad    12 年前

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