Обнаружить конкретную модель iPhone/iPod touch
Возможный дубликат:
Определить устройство (iPhone, iPod Touch) с помощью iOS
Я делаю игру, которая использует возможности одноранговой связи iPhone (и, возможно, iPod touch 2-го поколения). Однако, чтобы пользователи не пытались играть в мультиплеер на iPod 1-го поколения и iPhone 2G, мне нужно проверить конкретную модель устройства.
[Модель [UIDevice currentDevice]] только скажет мне, является ли устройство "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.
Ответы
Ответ 1
Наиболее полная категория UIDevice (Hardware), вероятно, http://github.com/erica/uidevice-extension/ (Эрика Садун):
[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
Ответ 2
Номер модели устройства можно получить с помощью 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
Ответ 3
Как насчет этого кода, если новая версия была выпущена, вы получите идентификатор с последним ноу-хау
#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;
}
Ответ 4
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
Ответ 5
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 secrets (прокрутите вниз до "внутренних кодов продуктов" )
Другим хорошим источником является:
everyiphone.com
Ответ 6
NSString* valueDevice = [[UIDevice currentDevice] model];
а затем проверьте, равна ли строка любому устройству, которое вы ищете:
if([email protected]"iPod1,1" )
{}
и вам должно быть хорошо идти