【iOS開発】iPhone SDKでデバイスの種類(iPhone・iPod touch)を判別する方法を解説
iOSアプリを開発していると、アプリがインストールされているデバイスの種類を判別し、機種に応じて異なる機能やUIを提供したいケースがあります。たとえば、「iPhone Xでは有効にするが、iPhone 7では無効にしたい機能がある」といった場合です。
本記事では、iOS SDKを使って現在利用中のデバイスを正確に特定する方法を、初心者にもわかるように順を追って解説します。
知っておきたい基本用語
デバイス情報を取得するために必要となる、主な用語を先に確認しておきましょう。
utsnameとは
utsnameは、iOSのDarwinモジュール内に定義されている構造体です。システムに関する情報(マシン名、OS名など)を格納します。
unameとは
unameは、utsname構造体へのポインタを引数として受け取り、処理結果としてInt32型を返すC言語の関数です。この関数を呼び出すことで、システム情報がutsname構造体に書き込まれます。
簡単にデバイス情報を取得する方法
まず、もっとも手軽に使えるプロパティを紹介します。次のコードはいずれも文字列を返します。
- UIDevice.current.localizedModel
- UIDevice.current.model
- UIDevice.current.name
しかし、これらのプロパティには大きな弱点があります。取得できるのは「iPhone」「iPad」といった大まかなカテゴリのみで、「iPhone 7 Plus」のような具体的な機種名までは判別できません。
正確な機種を特定する方法
Objective-Cでの実装
Objective-Cでは、uname関数を使ってmachineフィールドからモデル識別子を取得できます。
NSString* deviceName() {
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
}Mirrorとは
Swiftでは、構造体の内部構造を読み取るために「Mirror」を使用します。Mirrorとは、あらゆる型のインスタンスのサブ構造や表示形式を表現する仕組みです。これにより、utsname構造体内のmachineフィールド(Int8配列)を文字列として組み立てられます。
Swiftでの実装
上記の用語をすべて活かしたSwiftの実装例がこちらです。
func getDevice() -> String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
return identifier
}この関数を実行すると、モデル識別子(例:iPhone9,2)が文字列として返されます。
識別子から機種名へ変換する
この関数が返すのはモデルコードであり、そのままでは機種名ではありません。実際に利用する際は、取得した「identifier」変数の値を既知のモデルコード一覧と照合し、対応する機種名へ変換する必要があります。
たとえば、このコードをiPhone 7 Plusシミュレーター上で実行すると、次のようにモデルコードが出力されます。
Appleデバイスのモデルコード一覧
代表的なAppleデバイスのモデルコードと機種名の対応表を以下にまとめました。開発時の参照にお役立てください。
| iPod4,1 | iPod touch 第4世代 |
| iPod5,1 | iPod touch 第5世代 |
| iPod7,1 | iPod touch 第6世代 |
| iPhone3,1 / iPhone3,2 / iPhone3,3 | iPhone 4 |
| iPhone4,1 | iPhone 4s |
| iPhone7,2 | iPhone 6 |
| iPhone7,1 | iPhone 6 Plus |
| iPhone8,1 | iPhone 6s |
| iPhone8,2 | iPhone 6s Plus |
| iPhone8,4 | iPhone SE(第1世代) |
| iPhone9,1 / iPhone9,3 | iPhone 7 |
| iPhone9,2 / iPhone9,4 | iPhone 7 Plus |
| iPad2,1 / iPad2,2 / iPad2,3 / iPad2,4 | iPad 2 |
| iPad3,1 / iPad3,2 / iPad3,3 | iPad 第3世代 |
| iPad3,4 / iPad3,5 / iPad3,6 | iPad 第4世代 |
| iPad4,1 / iPad4,2 / iPad4,3 | iPad Air |
| iPad5,3 / iPad5,4 | iPad Air 2 |
| iPad2,5 / iPad2,6 / iPad2,7 | iPad mini |
| iPad4,4 / iPad4,5 / iPad4,6 | iPad mini 2 |
| iPad4,7 / iPad4,8 / iPad4,9 | iPad mini 3 |
| iPad5,1 / iPad5,2 | iPad mini 4 |
| iPad6,3 / iPad6,4 | iPad Pro(9.7インチ) |
| iPad6,7 / iPad6,8 | iPad Pro(12.9インチ) |
まとめ
iOSでデバイスを判別するには、uname関数とutsname構造体を使ってモデル識別子を取得し、その値を対応表と照合するのが確実な方法です。UIDeviceのmodelプロパティだけでは大まかなカテゴリしかわからないため、機種ごとの細かい分岐が必要な場合は、本記事で紹介した手法を活用してみてください。
-
iPodからiPhone 12/iPhone 11へ音楽を転送する3つの方法【iTunes・PCなしでもOK】
iPodは優れた音楽プレーヤーですが、進化し続けるiPhoneによって徐々にその役割を担われるようになりました。iPhoneは機能が豊富でストレージ容量も大きいため、iPodとiPhoneの両方を持ち歩く必要性は低くなっています。音楽再生デバイスとして十分な性能を持ちながら、他のさまざまなニーズにも応えてくれるのがiPhoneだからです。新しいiPhone 12を手に入れて、iPodに保存している音楽を新しいiPhoneに移行したいとお考えの方も多いのではないでしょうか。実は、iPodからiPhoneに音楽を転送する方法は主に3つあります。パソコンが手元にあるなら、iTunesまたはサードパー
-
iPhoneを脱獄する方法|リスク・種類・Electraでの具体的な手順を徹底解説
Appleによる細かい制限にうんざりしていませんか?自分のデバイスなのに「できること」「できないこと」をすべてAppleに決められていると感じるなら、iPhoneやiPadの「脱獄(ジャイルブレイク)」という選択肢があります。脱獄とは、Androidにおける「root化」やPCにおける「管理者権限の取得」に似た概念で、通常は変更できないシステム設定を書き換えたり、App Store以外で配布されているソフトウェアをインストールしたりすることを可能にする特権状態のことです。Appleが設けたロックを回避できる一方で、それ相応のリスクも伴います。脱獄にはどんなリスクがあるのか?メーカーの管理から解