24/7 twenty-four seven

iOS/OS X application programing topics.

iPhone 3Gと3GSやiPod touchの世代を判別する方法

UIDevice の model プロパティでは iPhone や iPod touch など、おおざっぱな区別しかできません。
3G か 3GS かの違いを識別するにはライブラリ関数 sysctlbyname() を使います。
sysctlbyname(3) Mac OS X Manual Page

sysctl() はシステムの様々な情報を取得する関数です。
iPhone のハードウェア情報の取得は次のようにします。

How to Determine Exactly Which Model of iPhone/iPod Is Running Your App

- (NSString *) platform
{
  size_t size;
  sysctlbyname("hw.machine", NULL, &size, NULL, 0);
  char *machine = malloc(size);
  sysctlbyname("hw.machine", machine, &size, NULL, 0);
  /*
  Possible values:
  "iPhone1,1" = iPhone 1G
  "iPhone1,2" = iPhone 3G
  "iPhone2,1" = iPhone 3GS
  "iPod1,1"   = iPod touch 1G
  "iPod2,1"   = iPod touch 2G
  */
  NSString *platform = [NSString stringWithCString:machine];

  free(machine);
  return platform;
}

最初の呼び出しで必要なバッファのサイズを取得して、2回目の呼び出しで、確保したバッファに情報が格納されます。
取得したモデル番号と機種の対応関係は上記の通りです。


Erica さんが、使いやすくクラスにまとめてくださってますので、こちらを利用するのが簡単です。
erica/uidevice-extension · GitHub

モデル番号以外にも MAC アドレスなどの取得が実装されています。