2013-01-17 116 views

回答

30

,你可以很容易地检测iphoneiphone5iPad与以下条件: -

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


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

我的回答: - Detect device type

+8

请不要比较'使用'=='浮动',这是不安全的。您最好使用[[UIScreen mainScreen]边界] .size.height> 567'。 – 2013-01-17 05:52:08

+0

接下来有传闻说iPod将会有5英寸的屏幕,所以如果你想为将来制作应用程序,这将导致很小的概率 – amar

+0

@ H2CO3是正确的!或者只是将它与浮点数相比较, [[UIScreen mainScreen]范围] .size .height == 568。0f – sleepwalkerfx

3

使用下面的代码:

#import <sys/utsname.h> 

- (NSString *)machineName 
{ 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    NSString *temp = [NSString stringWithCString:systemInfo.machine 
             encoding:NSUTF8StringEncoding]; 

    if ([temp rangeOfString:@"iPod"].location != NSNotFound) 
    { 
     return @"iPod"; 
    } 

    if ([temp rangeOfString:@"iPad"].location != NSNotFound) 
    { 
     return @"iPad"; 
    } 

    if ([temp rangeOfString:@"iPhone"].location != NSNotFound) 
    { 
     return @"iPhone"; 
    } 

    return @"Unknown device"; 
} 
+2

而不是'if(!(stuff == bar) )',使用更易读的'if(stuff!= bar)'。请! – 2013-01-17 05:53:32

+0

对不起,我的坏会保重,如果将来 – amar

2

您可以使用以下代码

if(screenSize.width==2048 && screenSize.height==1536) 
{ 
    LetterParams.DeviceType=1;//IPadRetina 
} 
else if(screenSize.width==2048/2 && screenSize.height==1536/2) 
{ 
    LetterParams.DeviceType=2;//IPad Non-Retina 
} 
else if(screenSize.width==1136 && screenSize.height==640) 
{ 
    LetterParams.DeviceType=3;//IPhoneRetina 
} 
else 
{ 
    LetterParams.DeviceType=4;//IPhone & Ipod 
} 
+0

比较浮点值是相当不安全的。根据CPU的情绪,你会发现如果条件不当,你会得到很多的假阴性,导致他们错误地进入'其他' – mylogon

1

这是我想到的一种方法,专注于屏幕测量功能的关键设备。这是确定您需要什么的快速方法。这将检测到iPhone 5和第5代iPod touch。

typedef enum{ 
    iPadRetina,iPadNoRetina,iPhoneiPod35InchRetina,iPhoneiPod35InchNoRetina,iPhoneiPod4InchRetina}DeviceType; 

-(void)yourCustomFunctionThatNeedsToKnowDeviceType 
{ 
    NSLog(@"device type = %i",[self getDeviceType]); 

    switch ([self getDeviceType]) 
    { 
     case iPadRetina: 
     { 
      NSLog(@"This device is one of the following: iPad 3, iPad 4"); 
      break; 
     } 
     case iPadNoRetina: 
     { 
      NSLog(@"This device is one of the following: iPad 1, iPad 2, iPad mini"); 
      break; 
     } 
     case iPhoneiPod35InchRetina: 
     { 
      NSLog(@"This device is one of the following: iPhone 4/4S or iPod Touch 4th Generation"); 
      break; 
     } 
     case iPhoneiPod35InchNoRetina: 
     { 
      NSLog(@"This device is one of the following: iPhone 3G/3GS or iPod Touch 3rd Generation"); 
      break; 
     } 
     case iPhoneiPod4InchRetina: 
     { 
      NSLog(@"This device is one of the following: iPhone 5 or iPod Touch 5th Generation"); 
      break; 
     } 
    } 
} 

-(int)getDeviceType 
{ 
    // Get the ratio of the device's screen (height/width) 
    CGFloat screenRatio = [UIScreen mainScreen].bounds.size.height/[UIScreen mainScreen].bounds.size.width; 

    // Initialize return value to negative value 
    DeviceType type = -1; 
    if(screenRatio > 1.5) 
    { 
     /* 
      4.0-Inch Screen 
      This implies that the device is either an iPhone 5 or a 5th generation iPod 
      Retina display is implicit 
     */ 
     type = iPhoneiPod4InchRetina; 
    } 
    else 
    { 
     /* 
      Device must be iPad 1/2/3/4/mini or iPhone 4/4S or iPhone 3G/3GS 
     */ 

     // Take a screenshot to determine if the device has retina display or not 
     UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0); 
     [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage *scaleCheckImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
     { 
      /* 
       Device must be iPad 1/2/3/4/mini 
      */ 
      if(scaleCheckImage.scale == 1) 
      { 
       // iPad 1/2/mini (No Retina) 
       type = iPadNoRetina; 
      } 
      else if(scaleCheckImage.scale == 2) 
      { 
       // iPad 3/4 (Retina) 
       type = iPadRetina; 
      } 
     } 
     else 
     { 
      /* 
       Device must be iPhone 4/4S or iPhone 3G/3GS or iPod Touch 3rd Generation or iPod Touch 4th Generation 
      */ 
      if(scaleCheckImage.scale == 1) 
      { 
       // iPhone 3G/3GS or iPod Touch 3rd Generation (No Retina) 
       type = iPhoneiPod35InchNoRetina; 
      } 
      else if(scaleCheckImage.scale == 2) 
      { 
       // iPhone 4/4S or iPod Touch 4th Generation (Retina) 
       type = iPhoneiPod35InchRetina; 
      } 
     } 
    } 
    return type; 
} 
11

这只是正常:

if([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad) { 
    NSLog(@"IPAD"); 
}else{ 
    NSLog(@"IPHONE"); 
} 
+3

这个答案应该是所有的分数点! –

1

我和其他人都保持在GitHub上代码,所以请把最新的代码从那里。我们不断在列表中添加新设备。

Objective-C的GitHub/DeviceUtil

斯威夫特GitHub/DeviceGuru

#include <sys/types.h> 
#include <sys/sysctl.h> 

- (NSString*)hardwareDescription { 
    NSString *hardware = [self hardwareString]; 
    if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; 
    if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; 
    if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; 
    if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; 
    if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; 
    if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G"; 
    if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G"; 
    if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad"; 
    if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini"; 
    if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI"; 
    //there are lots of other strings too, checkout the github repo 
    //link is given at the top of this answer 

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

    return nil; 
} 

- (NSString*)hardwareString { 
    size_t size = 100; 
    char *hw_machine = malloc(size); 
    int name[] = {CTL_HW,HW_MACHINE}; 
    sysctl(name, 2, hw_machine, &size, NULL, 0); 
    NSString *hardware = [NSString stringWithUTF8String:hw_machine]; 
    free(hw_machine); 
    return hardware; 
} 
1
if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) 
{ 
    NSLog(@"All iPads"); 
} 
else 
{ 
    else if (UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone) 
    { 
     if(screenHeight > 480 && screenHeight < 667) 
     { 
      NSLog(@"iPhone 5/5s/6"); 
     } 
     else if (screenHeight > 480 && screenHeight < 736) 
     { 
      NSLog(@"Other iPhones Resizable"); 
     } 
     else if (screenHeight > 480) 
     { 
      NSLog(@"iPhone 6 +"); 
     } 
     else 
     { 
      NSLog(@"iPhone 4s and others"); 
     } 
    } 
5

只是增加@Mohammad卡姆兰Usmani答案。更具体的iPhone类型:

@import UIKit; 

//Check which iPhone it is 
double screenHeight = [[UIScreen mainScreen] bounds].size.height; 
if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) 
{ 
    NSLog(@"All iPads"); 
} else if (UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone) 
{ 
    if(screenHeight == 480) { 
     NSLog(@"iPhone 4/4S"); 
     smallFonts = true; 
    } else if (screenHeight == 568) { 
     NSLog(@"iPhone 5/5S/SE"); 
     smallFonts = true; 
    } else if (screenHeight == 667) { 
     NSLog(@"iPhone 6/6S"); 
    } else if (screenHeight == 736) { 
     NSLog(@"iPhone 6+, 6S+"); 
    } else { 
     NSLog(@"Others"); 
    } 
}