Как я могу получить тип устройства iphone? - PullRequest
6 голосов
/ 01 октября 2011

Я хочу получить тип устройства iphone, если это iphone 2 или 3G или 4 в xcode 4.0.

Есть ли способ получить его?

Если это так, пожалуйста, сообщите мне.

Ответы [ 8 ]

15 голосов
/ 26 августа 2013

Я нашел новый алгоритм для получения типа устройства и версии iOS.

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


- (NSString *) platformString{

NSLog(@"[UIDevice currentDevice].model: %@",[UIDevice currentDevice].model);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);
NSLog(@"[UIDevice currentDevice].batteryLevel: %f",[UIDevice currentDevice].batteryLevel);      
struct utsname systemInfo;
uname(&systemInfo);
NSLog(@"[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]: %@",[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

    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,2"])    return @"iPhone 4 CDMA";
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,2"])    return @"iPhone 6";
if ([platform isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
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 (Cellular)";
if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (Cellular)";
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 (Cellular)";
if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (Cellular)";
if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (Cellular)";
if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (Cellular)";
if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (Cellular)";
if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (Cellular)";
if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
if ([platform isEqualToString:@"i386"])         return @"Simulator";
if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
return @"Unknown";
}
10 голосов
/ 01 октября 2011

На самом деле, у класса UIDevice нет метода platformString. С недокументированными методами ваше приложение будет отклонено Apple.

[[UIDevice currentDevice] model] // e.g. "iPod touch"

сделает свое дело.

8 голосов
/ 01 октября 2011

Калеб правильно, вы должны проверять не тип устройства, а функциональность. Например, вы можете проверить, поддерживает ли устройство многозадачность следующим образом:

UIDevice *device = [UIDevice currentDevice];
if ([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]) {
    // ...code to be executed if multitasking is supported.
    // respondsToSelector: is very useful
}

Если необходимо, вы можете проверить версию iOS, но знаете, что это не заменит проверку того, является ли объект respondsToSelector:.

#define IOS4_0 40000

// You'd probably want to put this in a convenient method
NSArray *versions = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
NSInteger major = [[versions objectAtIndex:0] intValue];
NSInteger minor = [[versions objectAtIndex:1] intValue];
NSInteger version = major * 10000 + minor * 100;

if (version >= IOS4_0) {
    // ...code to be executed for iOS4.0+
}

Насколько я знаю, документированного способа проверки модели устройства не существует.

4 голосов
/ 15 января 2013

Я добавил статический метод в свой проект для проверки типа устройства: iPad, iPhone4 (или менее) и iPhone5 для обработки экрана разных размеров.

+ (DeviceType) currentDeviceType
{
    DeviceType device = DEVICE_TYPE_IPAD ;
    if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone )
    {
        if( [[UIScreen mainScreen] bounds].size.height >= 568 || [[UIScreen mainScreen] bounds].size.width >= 568 )
        {
            device = DEVICE_TYPE_IPHONE5 ;
        }
        else
        {
            device = DEVICE_TYPE_IPHONE4 ;
        }
    }

    return device ;
}

Вы также можете использовать тип UIUserInterfaceIdiomPad.

Из того, что я могу сказать, iPod и iPhone предназначены для равного отношения. Но если вам нужно определить, является ли это iPod, проверьте, звонит ли он.

2 голосов
/ 19 октября 2012

Этот пост помог мне различить типы iPhone / iPad:

Вы можете получить тип модели (iPhone, iPad, iPod), как показано выше:

[[UIDevice currentDevice] model]

И чтобы дополнительно указать, вы можете импортировать и найти конкретный тип модели, возвращаемый в виде массива символов, с помощью следующего кода:

struct utsname u;
uname(&u);
char *type = u.machine;

И преобразовать его в NSString с помощью:

NSString *strType = [NSString stringWithFormat:@"%s", type];
2 голосов
/ 01 октября 2011

Проверьте это https://github.com/erica/uidevice-extension/

[[UIDevice currentDevice] platformString] //@"iPhone 4"
1 голос
/ 10 июня 2014

Вы можете определить некоторые макросы, выходящие за рамки ответа @csb на эту тему.


#define IS_IPHONE4 ([[UIScreen mainScreen] bounds].size.width == 480 || [[UIScreen mainScreen] bounds].size.height == 480)
#define IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.width == 568 || [[UIScreen mainScreen] bounds].size.height == 568)
#define IS_IPAD    ([[UIScreen mainScreen] bounds].size.width == 768 || [[UIScreen mainScreen] bounds].size.height == 768)

1 голос
/ 01 октября 2011

Обычный совет - не беспокоиться о том, на каком устройстве вы работаете, а вместо этого проверять нужные вам функции. Если вы посмотрите на тип устройства, вы обязательно сделаете неправильные предположения. Например, версии каждой модели, продаваемые на разных рынках, могут различаться, и могут появиться новые устройства, которые сообщают один и тот же тип, но имеют разные функции. Таким образом, тестируйте функции, а не модель.

...