107

可能重复:
使用 iOS 确定设备(iPhone、iPod Touch)

我正在制作一款利用 iPhone(可能还有第二代 iPod touch)的点对点蓝牙功能的游戏。但是,为了阻止用户尝试在 iPod 1st gen 和 iPhone 2G 上玩多人游戏,我需要检查特定的设备型号。

[[UIDevice currentDevice] model] 只会告诉我设备是“iPhone”还是“iPod touch”。有没有办法检查特定的设备型号,例如:“iPhone 3GS”、“iPod touch 第 1 代”之类的。

编辑:

UIDevice 有一个类别(我认为它是由 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 中获得批准。

4

6 回答 6

152

uname您可以使用from获取设备型号sys/utsname.h。例如:

#import <sys/utsname.h>

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

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

结果应该是:

@"i386" 在模拟器上
iPod Touch 上的@“iPod1,1”
iPod Touch 第二代上的@“iPod2,1”
@第三代 iPod Touch 上的“iPod3,1”
@第四代 iPod Touch 上的“iPod4,1”
iPhone 上的@“iPhone1,1”
@"iPhone1,2" 在 iPhone 3G 上
@"iPhone2,1" 在 iPhone 3GS 上
iPad 上的@“iPad1,1”
iPad 2 上的@"iPad2,1"
iPad 3(又名新 iPad)上的@"iPad3,1"
@"iPhone3,1" 在 iPhone 4 上
@"iPhone4,1" 在 iPhone 4S 上
@"iPhone5,1" 在 iPhone 5 上
@"iPhone5,2" 在 iPhone 5 上
于 2009-07-10T11:00:56.487 回答
66

最完整的 UIDevice(硬件)类别可能是http://github.com/erica/uidevice-extension/(作者 Erica Sadun):

[[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
于 2010-07-29T17:32:34.647 回答
23

这段代码怎么样,如果发布了新版本,您将使用最后知道的设备进行标识

#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;
}
于 2011-12-12T17:59:07.800 回答
4
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0) {
        hasHighResScreen = YES;
    }
}
于 2010-12-04T13:01:09.773 回答
4

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

于 2011-06-20T09:14:19.870 回答
-11
NSString* valueDevice = [[UIDevice currentDevice] model];

然后检查字符串是否等于您要查找的任何设备,例如:

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

你应该很高兴

于 2011-02-17T12:08:32.497 回答