2010年8月30日月曜日

機種名称を取得する

前回は UIDevice を使って各種情報を取得したが機種名称は取れなかった。

Cocoaの日々: UIDevice

例えば UIDevice.model から "iPhone" を取得できるが 3GS なのか 3G なのかがわからない。どうやったら機種名が取れるのか?


機種名称取得


機種名称取得の方法を探してみるといくつかみつかった。

Determine Device Type – 3G or 3GS / iPod First or Second Generation

Determine device (iPhone, iPod Touch) with iPhone SDK - Stack Overflow


特別な API は用意されていないので、どちらも sysctlbyname 経由で hw.machine 情報を取り出し、それを元に機種名に変換している。こんな感じ(擬似コード)
sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine];
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
     :


サンプル


サンプルを作ってみた。こんな感じ。


ちゃんと機種名が取れた。

ソースコードは GitHub からどうぞ。
DeviceTypeSample at 2010-08-30b from xcatsan's iOS-Sample-Code - GitHub

コードはこんな感じ。DeviceInfoUtilityというクラスを用意した。
@interface DeviceInfoUtility : NSObject {

}
+ (NSString *) hwMachine;
+ (NSString *) deviceName;

@end

まず hw.machine を取得する箇所。これは参考サイトからコピペした。
+ (NSString *) hwMachine{
    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;
}

機種名取得箇所。機種名称は plist に記述してそちらを参照するように変更した。機種名はどうせ今後増えるので。
+ (NSString *) deviceName {
 NSString* hwMachine = [self hwMachine];
 NSString* filePath = [[NSBundle mainBundle]
        pathForResource:@"DeviceNameList" ofType:@"plist"];
 NSDictionary* deviceList = [NSDictionary dictionaryWithContentsOfFile:filePath];
 NSString* deviceName = [deviceList objectForKey:hwMachine];

 if (deviceName == nil) {
  deviceName = hwMachine;
 }
 return deviceName;
}

該当する機種名称が存在しない場合は hw.machine の値をそのまま返すようにしている。こうしておけば新機種がでた場合でも最低限区別ができるようにはなる。

plistはこんな感じ。

0 件のコメント:

コメントを投稿