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 アドレスなどの取得が実装されています。