检测IOS设备类型

11

2
请检查以下链接:http://parasjoshi3.blogspot.ro/2013/01/get-device-model-or-device-type-and.html - TonyMkenu
9个回答

31

你可以使用以下条件轻松检测iphoneiphone5iPad

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


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

我的答案:检测设备类型


8
请不要使用==来比较float,这是不安全的。你最好使用[[UIScreen mainScreen] bounds].size.height > 567 - user529758
有传言称下一代iPod将拥有5英寸的屏幕,因此如果您想为未来制作应用程序,这将会带来一些小问题。 - amar
@H2CO3 是正确的!或者将其与浮点字面量进行比较,[[UIScreen mainScreen] bounds].size.height == 568.0f - Rukshan
如果 iPhone 应用在 iPad 上以框架方式运行,则 [[UIScreen mainScreen] bounds].size.height > 567 不起作用。 - heximal

13

这个很好用:

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

13

9
仅作为@Mohammad Kamran 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");
    }
}

4
请使用以下代码:
#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))。谢谢! - user529758
抱歉,我的错,以后会注意的。 - amar

2
我和其他人正在GitHub上维护代码,请从那里获取最新的代码。我们不断地将新设备添加到列表中。
Objective-C: GitHub/DeviceUtil Swift: 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;
}

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
}

比较浮点数值是非常不安全的。根据 CPU 的心情,你会发现在那些 if 条件语句中会得到很多错误的负值,导致它们错误地进入“else”中。 - mylogon

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");
        }
    }

1
这是我想出来的一种方法,专注于屏幕测量功能的关键设备。这是一种快速确定您所需内容的方法。它可以检测到iPhone 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;
}

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