9

In my application (written in Objective-C), how do I detect if the device is an iPhone, iPad, or iPhone5?

if([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    // [iphone] or [itouch]
} else {
    // [ipad]
}
Cœur
  • 37,241
  • 25
  • 195
  • 267
Emilie
  • 167
  • 1
  • 1
  • 8

5 Answers5

30

you can easly detect iphone, iphone5 and iPad with below condition (But not iTouch! iTouch is treated as if it were an iPhone with this code!):-

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


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

UPDATE

You can also use MACRO or define Variable for check is that iPhone5,iPhone4 or iPad like Bellow:-

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

Example:-

if(isiPhone)
     {
         if (isiPhone5)
         {


         }
         else
         {
             //iphone 3.5 inch screen
         }
     }
     else
     {
            //[ipad]
     }
Albert Renshaw
  • 17,282
  • 18
  • 107
  • 195
Nitin Gohel
  • 49,482
  • 17
  • 105
  • 144
  • @NitinGohel suppose in future launch new iphone device say `5s` having different height then i would failed. so avoid it and try to find most optimize soution – Kamar Shad Oct 30 '12 at 13:13
  • @Kamarshad may be You are right but yet i just done like this way thats why i just put my answer here only if you have more optimize solution then put your answer i am really happy to know new things – Nitin Gohel Oct 30 '12 at 13:17
  • @Kamarshad yes give your answer – Emilie Oct 30 '12 at 13:23
  • 1
    You should change from else to else if and checking for UIUserInterfaceIdiomPad because who knows if Apple will some day introduce an iPud, iPid or iPed (or an iWatch) and you may not want to treat them like an iPad. ;) Same goes for 568 height … what if Apple releases a wider-widescreen phone? It gets treated like a 3.5 inch screen in your app. – CodeSmile Mar 13 '13 at 12:22
  • @LearnCocos2D i just given answer of question who asking that how detect iphone, iphone5 and iPad – Nitin Gohel Mar 15 '13 at 13:47
  • Maybe you should update the question since iPhone 6 and 6+ are out. – Miknash Jan 21 '15 at 12:08
  • @Itachi well i seen you answer list there is many answer that just a 2 line and as par stackoverflow that must be a comment instead of answer. anyway thanks for down voted i dont mind but that 568 is still working lol – Nitin Gohel Dec 02 '15 at 05:25
11

Please check below code:

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

Hope this works for you...

gadu
  • 1,816
  • 1
  • 17
  • 31
iCreative
  • 1,499
  • 1
  • 9
  • 22
  • 1
    Does somebody have confirmed updates for newer generation models (iPhone 5, 6, ..)? – nyi Oct 24 '14 at 08:08
  • When i run your code in iPhone 6 then it will give me iPhone7,2. I am not getting this. I want exact model name of iPhone. For ex. iPhone 4s , iPhone 5 , iPhone 6 , iPhone 6s,etc... – Birju Oct 31 '15 at 09:14
  • @nyi just proposed an edit with all the confirmed updates – gadu Feb 10 '16 at 20:28
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;
}

The first statement checks weather the device you have has the iPhone 5 Screen.

The Second checks weather you're using a iPad.

The third returns the normal xib for the iPhone 4s and prior.

Please note, to make this work you'll have to create 3 different XIB's, all with a different suffix.

ViewController.xib

ViewController_568.xib

ViewController_iPad.xib

Sam Guichelaar
  • 457
  • 2
  • 12
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...



And also, just for reference... iTouch is this:

if ([[UIDevice currentDevice].model hasPrefix:@"iPod"]) {//iTouch
Albert Renshaw
  • 17,282
  • 18
  • 107
  • 195
0

Here are a bunch of constants you can stick in your PCH file and use throughout your application which give you a lot of different things you can test for. (Widescreen here means iPhone 5 "taller" screen)

#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

You can use it like this:

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

if(IS_WIDESCREEN){
    // load 4" screen stuff here
}
Thomas Clayson
  • 29,657
  • 26
  • 147
  • 224