2012年9月26日水曜日

アプリを起動しているデバイスの機種判定

アプリを起動しているデバイスの機種判定の方法について。iPhone5が発売されてデバイスの解像度の種類も増えたのでメモしておきます。

機種判定

デバイスの機種を判定する方法はいくらかあると思いますが、調べるとsysctlbyname関数を使った方法が一般的のようです。機種判定の方法は、今回はカテゴリ機能を持ったUIDeviceクラスを実装して取得する方法で行います。

機種判定をするクラスの作成





インターフェース・実装ファイル

UIDevice+HogeHoge.h

#import <UIKit/UIKit.h>

@interface UIDevice (HogeHoge)

- (NSString *) platformName;

@end

UIDevice+HogeHoge.h

#import "UIDevice+HogeHoge.h"
#include <sys/sysctl.h>

@implementation UIDevice (HogeHoge)

/*
以下取得できるプラットフォームコード(左)
*/
/*
 Platforms
 
 iFPGA ->        ??

 iPhone1,1 ->    iPhone 1G, M68
 iPhone1,2 ->    iPhone 3G, N82
 iPhone2,1 ->    iPhone 3GS, N88
 iPhone3,1 ->    iPhone 4/AT&T, N89
 iPhone3,2 ->    iPhone 4/Other Carrier?, ??
 iPhone3,3 ->    iPhone 4/Verizon, TBD
 iPhone4,1 ->    (iPhone 4S/GSM), TBD
 iPhone4,2 ->    (iPhone 4S/CDMA), TBD
 iPhone4,3 ->    (iPhone 4S/???)
 iPhone5,1 ->    iPhone Next Gen, TBD
 iPhone5,1 ->    iPhone Next Gen, TBD
 iPhone5,1 ->    iPhone Next Gen, TBD

 iPod1,1   ->    iPod touch 1G, N45
 iPod2,1   ->    iPod touch 2G, N72
 iPod2,2   ->    Unknown, ??
 iPod3,1   ->    iPod touch 3G, N18
 iPod4,1   ->    iPod touch 4G, N80
 
 // Thanks NSForge
 iPad1,1   ->    iPad 1G, WiFi and 3G, K48
 iPad2,1   ->    iPad 2G, WiFi, K93
 iPad2,2   ->    iPad 2G, GSM 3G, K94
 iPad2,3   ->    iPad 2G, CDMA 3G, K95
 iPad3,1   ->    (iPad 3G, WiFi)
 iPad3,2   ->    (iPad 3G, GSM)
 iPad3,3   ->    (iPad 3G, CDMA)
 iPad4,1   ->    (iPad 4G, WiFi)
 iPad4,2   ->    (iPad 4G, GSM)
 iPad4,3   ->    (iPad 4G, CDMA)

 AppleTV2,1 ->   AppleTV 2, K66
 AppleTV3,1 ->   AppleTV 3, ??

 i386, x86_64 -> iPhone Simulator
*/

- (NSString *) platformName
{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platformName = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    free(machine);

    return platformName;
}

@end

デバイスのプラットフォームコードを返すメソッドをひとつ。プラットフォームコードは参考記事から抜粋しています。

使い方

HugaViewController.m

#import "HugaViewController.h"
#import "UIDevice+DeviceName.h"
:
:
if ([[[UIDevice currentDevice]platformName]hasPrefix:@" iPhone5,1"]) {
    NSLog(@"iPhone5");
}else{
    /*その他の処理*/
}

ここの部分は実機で試していないので上手くできるのか分かりません。お手数ですがご自分で試してみてください。

おわり

おそらく機種判定はAppDelegateでやるのがよさそうですね。実機で試す環境がまだ整っていないので、環境を整えて近いうちに試してみます。間違いなどありましたら指摘していただけると幸いです。

参考記事

端末情報を取得する - CH3COOH(酢酸)の実験室
erica/uidevice-extension – GitHub
iPhoneアプリ開発: iPhone 4と3GSと3GやiPod touchの世代を判別する - 情熱とスキルと市場

0 件のコメント:

コメントを投稿