检测iOS设备类型

9

在我的应用程序(使用Objective-C编写)中,如何检测设备是否为iPhone,iPad或iPhone5?

if([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    // [iphone] or [itouch]
} else {
    // [ipad]
}

2
如果我发布这个问题,那是因为我还没有找到答案!!! - Emilie
可能是 https://dev59.com/13NA5IYBdhLWcg3wC5Xh#1108927 和 https://dev59.com/unI_5IYBdhLWcg3wEOrq 的重复问题。 - HarshIT
1
@Emilie 这个问题在这里经常被问到。 - sosborn
您可以在 http://bit.ly/Ts4xZq 找到相关的编程内容。@Emilie - HarshIT
如果你找不到那个简单的问题,那么你可能没有搜索很多... :) - user1617119
5个回答

30

使用下面的条件可以轻松检测iPhone、iPhone 5和iPad(但不包括iTouch!iTouch将被视为使用此代码的iPhone!):

 if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
 {
     if ([[UIScreen mainScreen] bounds].size.height == 568)
     {


     }
     else
     {
         //iphone 3.5 inch screen
     }
 }
 else
 {
        //[ipad]
 }

更新

您也可以使用宏或定义变量来检查是否为iPhone5、iPhone4或iPad,如下所示:

#define isiPhone5  ([[UIScreen mainScreen] bounds].size.height == 568)?TRUE:FALSE
#define isiPhone  (UI_USER_INTERFACE_IDIOM() == 0)?TRUE:FALSE

例子:

if(isiPhone)
     {
         if (isiPhone5)
         {


         }
         else
         {
             //iphone 3.5 inch screen
         }
     }
     else
     {
            //[ipad]
     }

假设未来推出了新的 iPhone 设备,比如 5s,如果高度不同,那么我就会失败。因此,要避免这种情况,并尝试找到最优化的解决方案。 - Kamar Shad
@Kamarshad,你也许是对的,但我只是按照自己的方式完成了,所以我只把我的答案放在这里。如果你有更优化的解决方案,那就请写下你的答案,我很愿意了解新的东西。 - Nitin Gohel
@Kamarshad,是的,请给出你的答案。 - Emilie
1
你应该将else改为elseif并检查UIUserInterfaceIdiomPad,因为谁知道苹果是否会推出iPud、iPid或iPed(或iWatch),你可能不想将它们视为iPad。同样的情况也适用于568高度...如果苹果发布了更宽的屏幕手机,它将被视为你的应用程序中的3.5英寸屏幕。 - CodeSmile
@LearnCocos2D 我刚刚回答了一个问题,解决了如何检测 iPhone、iPhone5 和 iPad 的问题。 - Nitin Gohel
显示剩余2条评论

11
请查看以下代码: UIDevice_enhanced.h
@interface UIDevice (Enhanced)

typedef enum {
    kUnknownPlatform = 0,
    kiPhone1G,
    kiPhone3G,
    kiPhone3GS,
    kiPhone4,
    kiPhone4Verizon,
    kiPhone4S,
    kiPhone5GSM,
    kiPhone5CDMA,
    kiPhone5CGSM,
    kiPhone5CCDMA,
    kiPhone5SGSM,
    kiPhone5SCDMA,
    kiPhone6,
    kiPhone6P,
    kiPhone6S,
    kiPhone6SP,
    kiPodTouch1G,
    kiPodTouch2G,
    kiPodTouch3G,
    kiPodTouch4G,
    kiPodTouch5G,
    kiPad,
    kiPad2Wifi,
    kiPad2GSM,
    kiPad2CMDA,
    kiPad3Wifi,
    kiPad3GSM,
    kiPad3CMDA,
    kiPad4Wifi,
    kiPad4GSM,
    kiPad4CMDA,
    kiPadAirWifi,
    kiPadAirCellular,
    kiPadMiniWifi,
    kiPadMiniGSM,
    kiPadMiniCDMA,
    kiPadMini2GWifi,
    kiPadMini2GCellular,
    kSimulator
} PlatformType;

- (NSString *) platformName;
- (PlatformType) platform;

@end

UIDevice_enhanced.m

#import "UIDevice_enhanced.h"
#include <sys/utsname.h>

@interface UIDevice (Enhanced)
- (NSString *) platformCode;
@end 


@implementation UIDevice (Enhanced)

// Utility method (private)
- (NSString*) platformCode {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString* platform =  [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

    return platform;
}

// Public method to use
- (NSString*) platformName {
    NSString* platform = [self platformCode];

        if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon iPhone 4";
if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
if ([platform isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
if ([platform isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";

if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";

if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
if ([platform isEqualToString:@"iPad4,4"])      return @"iPad mini 2G (WiFi)";
if ([platform isEqualToString:@"iPad4,5"])      return @"iPad mini 2G (Cellular)";

if ([platform isEqualToString:@"i386"])         return @"Simulator";
if ([platform isEqualToString:@"x86_64"])       return @"Simulator";

return platform;
}

// Public method to use
- (PlatformType) platform {
    NSString *platform = [self platformCode];
    if ([platform isEqualToString:@"iPhone1,1"])    return kiPhone1G;
    if ([platform isEqualToString:@"iPhone1,2"])    return kiPhone3G;
    if ([platform isEqualToString:@"iPhone2,1"])    return kiPhone3GS;
    if ([platform isEqualToString:@"iPhone3,1"])    return kiPhone4;
    if ([platform isEqualToString:@"iPhone3,2"])    return kiPhone4Verizon;
    if ([platform isEqualToString:@"iPhone4,1"])    return kiPhone4S;
    if ([platform isEqualToString:@"iPhone5,1"])    return kiPhone5GSM;
    if ([platform isEqualToString:@"iPhone5,2"])    return kiPhone5CDMA;
    if ([platform isEqualToString:@"iPhone5,3"])    return kiPhone5CGSM;
    if ([platform isEqualToString:@"iPhone5,4"])    return kiPhone5CCDMA;
    if ([platform isEqualToString:@"iPhone6,1"])    return kiPhone5SGSM;
    if ([platform isEqualToString:@"iPhone6,2"])    return kiPhone5SCDMA;
    if ([platform isEqualToString:@"iPhone7,1"])    return kiPhone6P;
    if ([platform isEqualToString:@"iPhone7,2"])    return kiPhone6;
    if ([platform isEqualToString:@"iPhone8,2"])    return kiPhone6SP;
    if ([platform isEqualToString:@"iPhone8,1"])    return kiPhone6S;

    if ([platform isEqualToString:@"iPod1,1"])      return kiPodTouch1G;
    if ([platform isEqualToString:@"iPod2,1"])      return kiPodTouch2G;
    if ([platform isEqualToString:@"iPod3,1"])      return kiPodTouch3G;
    if ([platform isEqualToString:@"iPod4,1"])      return kiPodTouch4G;
    if ([platform isEqualToString:@"iPod5,1"])      return kiPodTouch5G;

    if ([platform isEqualToString:@"iPad1,1"])      return kiPad;
    if ([platform isEqualToString:@"iPad2,1"])      return kiPad2Wifi;
    if ([platform isEqualToString:@"iPad2,2"])      return kiPad2GSM;
    if ([platform isEqualToString:@"iPad2,3"])      return kiPad2CMDA;
    if ([platform isEqualToString:@"iPad2,4"])      return kiPad2Wifi;
    if ([platform isEqualToString:@"iPad2,5"])      return kiPadMiniWifi;
    if ([platform isEqualToString:@"iPad2,6"])      return kiPadMiniGSM;
    if ([platform isEqualToString:@"iPad2,7"])      return kiPadMiniCDMA;
    if ([platform isEqualToString:@"iPad3,1"])      return kiPad3Wifi;
    if ([platform isEqualToString:@"iPad3,2"])      return kiPad3CDMA;
    if ([platform isEqualToString:@"iPad3,3"])      return kiPad3GSM;
    if ([platform isEqualToString:@"iPad3,4"])      return kiPad4Wifi;
    if ([platform isEqualToString:@"iPad3,5"])      return kiPad4GSM;
    if ([platform isEqualToString:@"iPad3,6"])      return kiPad4CDMA;
    if ([platform isEqualToString:@"iPad4,1"])      return kiPadAirWifi;
    if ([platform isEqualToString:@"iPad4,2"])      return kiPadAirCellular;
    if ([platform isEqualToString:@"iPad4,4"])      return kiPadMini2GWifi;
    if ([platform isEqualToString:@"iPad4,5"])      return kiPadMini2GCellular;

    if ([platform isEqualToString:@"i386"])         return kSimulator;
    if ([platform isEqualToString:@"x86_64"])       return kSimulator;

    return kUnknownPlatform;
}

@end

希望这对你有用...


1
有人有新一代型号(iPhone 5、6等)的确认更新吗? - nyi
当我在iPhone 6上运行您的代码时,它会给我iPhone7,2。我不明白这是为什么。我想要iPhone的确切型号名称。例如:iPhone 4s,iPhone 5,iPhone 6,iPhone 6s等... - Birju
@nyi刚刚提出了一个编辑,其中包含所有已确认的更新。 - gadu

1
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if ([[ UIScreen mainScreen ] bounds ].size.height == 568 ) {
nibName = [NSString stringWithFormat:@"%@_568", nibName];

}

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
nibName = [NSString stringWithFormat:@"%@_iPad", nibName]; {

}

if (self = [super initWithNibName:nibName bundle:nibBundle]) {
}

return self;
}

第一条语句检查你所拥有的设备是否具有iPhone 5屏幕。
第二条语句检查你是否正在使用iPad。
第三条语句返回iPhone 4s及之前版本的普通xib。
请注意,为使此方法有效,您需要创建3个不同的XIB,每个都带有不同的后缀。

ViewController.xib

ViewController_568.xib

ViewController_iPad.xib


1
if ([[UIDevice currentDevice].model hasPrefix:@"iPhone"]) {//iPhone... (not iTouch or iPad)


if ([[UIDevice currentDevice].model hasPrefix:@"iPad"]) {//iPad...


if (([[UIDevice currentDevice].model hasPrefix:@"iPhone"]) && ([UIScreen mainScreen]bounds].size.height == 568)) {//iPhone5...

并且,仅供参考... iTouch是这样的:



if ([[UIDevice currentDevice].model hasPrefix:@"iPod"]) {//iTouch

0
以下是一些常量,您可以将它们放入 PCH 文件中,并在整个应用程序中使用。这些常量能够提供许多不同的测试选项。(这里的 Widescreen 意味着 iPhone 5 的“更高”屏幕)
#ifndef IS_WIDESCREEN
#define IS_WIDESCREEN   (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)
#endif

#ifndef IS_IPHONE
#define IS_IPHONE       ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"])
#endif

#ifndef IS_IPOD
#define IS_IPOD         ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"])
#endif

#ifndef IS_IPAD
#define IS_IPAD         ([[[UIDevice currentDevice] model] isEqualToString:@"iPad"])
#endif

#ifndef IS_IPHONE5
#define IS_IPHONE5      (IS_WIDESCREEN && IS_IPHONE)
#endif

#ifndef IS_IPOD5
#define IS_IPOD5        (IS_WIDESCREEN && IS_IPOD)
#endif

你可以像这样使用它:

if(IS_IPHONE5){
    // load iPhone5 code/nibs
}

if(IS_WIDESCREEN){
    // load 4" screen stuff here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接