代码之家  ›  专栏  ›  技术社区  ›  Dimitris

检测特定的iPhone/iPod touch型号[重复]

  •  105
  • Dimitris  · 技术社区  · 16 年前


    Determine device (iPhone, iPod Touch) with iOS

    我正在制作一款利用iPhone(可能还有第二代iPod touch)的点对点蓝牙功能的游戏。然而,为了阻止用户尝试在iPod1st gen和iPhone2G上玩多人游戏,我需要检查具体的设备型号。

    [[UIDevice currentDevice]model]只会告诉我该设备是“iPhone”还是“iPod touch”。有没有办法检查具体的设备型号,比如:“iPhone3GS”、“iPodtouch第一代”之类的。

    编辑:

    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中获得批准。

    6 回复  |  直到 7 年前
        1
  •  152
  •   JAL    10 年前

    您可以使用获取设备型号 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
    
        2
  •  66
  •   djromero    13 年前

    最完整的设备(硬件)类别可能是 http://github.com/erica/uidevice-extension/ (埃里卡·萨顿):

    [[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
    [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
    
        3
  •  23
  •   Rodrigo    12 年前

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

    #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
  •  4
  •   gotnull mzelina    15 年前
    BOOL hasHighResScreen = NO;
    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale > 1.0) {
            hasHighResScreen = YES;
        }
    }
    
        5
  •  4
  •   Sten    14 年前

    iPhone4是iPhone3,1和iPhone3,2
    iPhone4S是iPhone4,1
    iPad2是iPad2,1 iPad2,2和iPad2,3,具体取决于版本(GSM等)

    看见 Iphone secrets

    everyiphone.com

        6
  •  -11
  •   Matt    11 年前
    NSString* valueDevice = [[UIDevice currentDevice] model];
    

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

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

    你应该可以走了