Определение конкретной модели iPhone / iPod touch [дубликат]
Возможный дубликат:
определение устройства (iPhone, iPod Touch) с помощью iPhone SDK
Я создаю игру, которая использует пиринговые возможности bluetooth iPhone (и, вероятно, iPod touch 2-го поколения). Однако, чтобы пользователи не пытались играть в мультиплеер на iPod 1-го поколения и iPhone 2G, мне нужно проверить конкретную модель устройства.
[[UIDevice currentDevice] model] сообщит мне только, является ли устройство "iPhone "или" iPod touch". Есть ли способ проверить конкретную модель устройства, например: "iPhone 3GS", "iPod touch 1-го поколения" или что-то еще.
Редактировать:
Существует категория для UIDevice (я думаю, что она создана Эрикой Садун, я не ставлю ей это в заслугу), которая использует следующий код для получения конкретной модели устройства. Вы можете найти здесь всю категорию вместе с другими полезными материалами: https://github.com/erica/uidevice-extension
#include <sys/types.h>
#include <sys/sysctl.h>
@implementation UIDevice (Hardware)
/*
Platforms
iPhone1,1 -> iPhone 1G
iPhone1,2 -> iPhone 3G
iPod1,1 -> iPod touch 1G
iPod2,1 -> iPod touch 2G
*/
- (NSString *) platform
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);
return platform;
}
Это работает и приложения, использующие это, недавно были одобрены в AppStore.
6 ответов:
Наиболее полной категорией UIDevice (Hardware), вероятно, является http://github.com/erica/uidevice-extension/ (Автор-Эрика Садун):
[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
Вы можете получить номер модели устройства, используя
uname
изsys/utsname.h
. Например:#import <sys/utsname.h> NSString* machineName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; }
Результат должен быть:
@"i386" on the simulator @"iPod1,1" on iPod Touch @"iPod2,1" on iPod Touch Second Generation @"iPod3,1" on iPod Touch Third Generation @"iPod4,1" on iPod Touch Fourth Generation @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPad1,1" on iPad @"iPad2,1" on iPad 2 @"iPad3,1" on iPad 3 (aka new iPad) @"iPhone3,1" on iPhone 4 @"iPhone4,1" on iPhone 4S @"iPhone5,1" on iPhone 5 @"iPhone5,2" on iPhone 5
Как насчет этого кода, если новая версия была выпущена, вы будете идентифицировать с последним известным устройством
#include <sys/types.h> #include <sys/sysctl.h> - (NSString *)getModel { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *model = malloc(size); sysctlbyname("hw.machine", model, &size, NULL, 0); NSString *sDeviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding]; free(model); if ([sDeviceModel isEqual:@"i386"]) return @"Simulator"; //iPhone Simulator if ([sDeviceModel isEqual:@"iPhone1,1"]) return @"iPhone1G"; //iPhone 1G if ([sDeviceModel isEqual:@"iPhone1,2"]) return @"iPhone3G"; //iPhone 3G if ([sDeviceModel isEqual:@"iPhone2,1"]) return @"iPhone3GS"; //iPhone 3GS if ([sDeviceModel isEqual:@"iPhone3,1"]) return @"iPhone4 AT&T"; //iPhone 4 - AT&T if ([sDeviceModel isEqual:@"iPhone3,2"]) return @"iPhone4 Other"; //iPhone 4 - Other carrier if ([sDeviceModel isEqual:@"iPhone3,3"]) return @"iPhone4"; //iPhone 4 - Other carrier if ([sDeviceModel isEqual:@"iPhone4,1"]) return @"iPhone4S"; //iPhone 4S if ([sDeviceModel isEqual:@"iPhone5,1"]) return @"iPhone5"; //iPhone 5 (GSM) if ([sDeviceModel isEqual:@"iPod1,1"]) return @"iPod1stGen"; //iPod Touch 1G if ([sDeviceModel isEqual:@"iPod2,1"]) return @"iPod2ndGen"; //iPod Touch 2G if ([sDeviceModel isEqual:@"iPod3,1"]) return @"iPod3rdGen"; //iPod Touch 3G if ([sDeviceModel isEqual:@"iPod4,1"]) return @"iPod4thGen"; //iPod Touch 4G if ([sDeviceModel isEqual:@"iPad1,1"]) return @"iPadWiFi"; //iPad Wifi if ([sDeviceModel isEqual:@"iPad1,2"]) return @"iPad3G"; //iPad 3G if ([sDeviceModel isEqual:@"iPad2,1"]) return @"iPad2"; //iPad 2 (WiFi) if ([sDeviceModel isEqual:@"iPad2,2"]) return @"iPad2"; //iPad 2 (GSM) if ([sDeviceModel isEqual:@"iPad2,3"]) return @"iPad2"; //iPad 2 (CDMA) NSString *aux = [[sDeviceModel componentsSeparatedByString:@","] objectAtIndex:0]; //If a newer version exist if ([aux rangeOfString:@"iPhone"].location!=NSNotFound) { int version = [[aux stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] intValue]; if (version == 3) return @"iPhone4" if (version >= 4) return @"iPhone4s"; } if ([aux rangeOfString:@"iPod"].location!=NSNotFound) { int version = [[aux stringByReplacingOccurrencesOfString:@"iPod" withString:@""] intValue]; if (version >=4) return @"iPod4thGen"; } if ([aux rangeOfString:@"iPad"].location!=NSNotFound) { int version = [[aux stringByReplacingOccurrencesOfString:@"iPad" withString:@""] intValue]; if (version ==1) return @"iPad3G"; if (version >=2) return @"iPad2"; } //If none was found, send the original string return sDeviceModel; }
BOOL hasHighResScreen = NO; if ([UIScreen instancesRespondToSelector:@selector(scale)]) { CGFloat scale = [[UIScreen mainScreen] scale]; if (scale > 1.0) { hasHighResScreen = YES; } }
IPhone 4 - это iPhone3, 1 и iPhone3, 2
iPhone 4S - это iPhone4, 1
iPad 2 - это iPad2, 1 iPad2, 2 и iPad2, 3 в зависимости от версии (GSM и т. д.)
iPad 3 - это iPad3, 1 iPad3, 2 и iPad3, 3 в зависимости от версии (GSM и т. д.)Смотрите секреты Iphone (прокрутите вниз до "внутренние коды продуктов")
Еще один хороший источник: everyiphone.com