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はこんな感じ。
Responses
Leave a Response