web-dev-qa-db-ja.com

特定のiPhone / iPod touchモデルを検出する

可能性のある複製:
iOSでデバイス(iPhone、iPod Touch)を決定

私は、iPhone(およびおそらくiPod touch第2世代)のピアツーピアのBluetooth機能を利用するゲームを作っています。ただし、ユーザーがiPod第1世代とiPhone 2Gでマルチプレーヤーをプレイしようとするのを止めるには、特定のデバイスモデルを確認する必要があります。

[[UIDevice currentDevice] model]は、デバイスが「iPhone」または「iPod touch」の場合にのみ通知します。 「iPhone 3GS」、「iPod touch 1st generation」などの特定のデバイスモデルを確認する方法はありますか。

編集:

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で承認されました。

106
Dimitris

最も完全なUIDevice(ハードウェア)カテゴリは、おそらく http://github.com/erica/uidevice-extension/ (by Erica Sadun):

[[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
65
djromero

unameを使用してデバイスのモデル番号を取得できますsys/utsname.h。例えば:

#import <sys/utsname.h>

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

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

結果は次のようになります。

 @ "i386"シミュレーター
 @ "iPod1,1" on iPod Touch 
 @ "iPod2,1" on iPod Touch Second Generation 
 @ "iPod3 、1 "iPod Touchの第3世代
 @" iPod4,1 "のiPod Touch第4世代
 @" iPhone1,1 "のiPhone 
 @" iPhone1,2 "のiPhone 3G 
 @ "iPhone2,1" iPhone 3GS 
 @ "iPad1,1" iPad 
 @ "iPad2,1" iPad2 
 @ "iPad3 、1 "iPad 3(別名新しいiPad)
 @" iPhone3,1 "on iPhone 4 
 @" iPhone4,1 "on iPhone 4S 
 @" iPhone5,1 " iPhone 5 
 @ "iPhone5,2" iPhone 5 
152
Will Harris

このコードはどうですか、新しいバージョンがリリースされた場合、最後に知っているデバイスで識別します

#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;
}
23
Rodrigo
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0) {
        hasHighResScreen = YES;
    }
}
4
fuzz

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

4
Sten