检测特定的 iPhone/iPod touch 模型

可能的复制品:
用 iOS 确定设备(iPhone,iPod Touch)

我正在做一个游戏,利用点对点的蓝牙功能的 iPhone (可能是 iPod touch 第二代)。然而,为了阻止用户在 iPod 1和 iPhone 2G 上玩多人游戏,我需要检查一下具体的设备型号。

[[ UIDevicecurrentDevice ]模型]只能告诉我这个设备是“ iPhone”还是“ iPod touch”。有没有一种方法来检查特定的设备型号,比如: “ iPhone3GS”,“ iPod touch 第一代”或者其他什么。

编辑:

UIDdevice 有一个分类(我认为它是由 Erica Sadun 创建的,我不会为此居功) ,它使用以下代码来获得特定的设备模型。您可以在这里找到整个类别以及其他有用的东西: 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 中得到了批准。

86337 次浏览

You can get the device model number using uname from sys/utsname.h. For example:

#import <sys/utsname.h>


NSString*
machineName()
{
struct utsname systemInfo;
uname(&systemInfo);


return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
}

The result should be:

@"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

Most complete UIDevice (Hardware) category probably is http://github.com/erica/uidevice-extension/ (by Erica Sadun):

[[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
NSString* valueDevice = [[UIDevice currentDevice] model];

and then check if the string is equal to whatever device you are looking for like :

if(value==@"iPod1,1" )
{}

and you should be good to go

iPhone 4 is iPhone3,1 and iPhone3,2
iPhone 4S is iPhone4,1
iPad 2 is iPad2,1 iPad2,2 and iPad2,3 depending on version (GSM etc)
iPad 3 is iPad3,1 iPad3,2 and iPad3,3 depending on version (GSM etc)

See Iphone secrets (scroll down to "internal product codes")

Another good source is: everyiphone.com

How about this code, if new version was released, you will identifier with the last know device

#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;
}