[iOS][Android][Tips] デバイスモデル名を取得する
iOS と Android のデバイスのモデル名
モバイルアプリの運用に欠かせない、デバイスのモデル名。モバイルアプリがどのようなデバイスで使われているか知るためには欠かせない情報のひとつです。利用する機会が多いので、簡単ですが取得方法をまとめました。
iOS の場合
iOS の場合は C 言語のライブラリ関数である utsname
を使用します。
Objective-C
utsname
関数で取得します。UIDevice のカテゴリを作り、クラスメソッドにしてしまうのが楽です。
#import <UIKit/UIKit.h> @interface UIDevice (Model) + (NSString *)modelName; @end
#import "UIDevice+Model.h" #import <sys/utsname.h> @implementation UIDevice (Model) + (NSString *)modelName { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } @end
あとは適当な場所で参照します。
- (void) printModelName { NSLog(@"Model Name: %@", [UIDevice modelName]); }
こんな感じで出力されます。
2016-07-06 14:33:29.079 DeviceSample[736:272375] Device Name: iPhone6,1
iOS の場合は一般的なモデル名ではなく、各モデルに振られたモデル番号が取得できます(iPhone7,1
や iPhone7,2
など)。一般的なモデル名を取得したい場合はこちらを参考に変換する必要があります。しかし、この場合は新製品が出るたびに更新する必要があります。アプリの画面上に出すのではなく、あくまで内部的に使いたいという目的であればそのままの値を使うことをお勧めします。
Swift
Swift で取得したい場合は、まず Bridging Header を作成し、その中でインポートします。
#import <sys/utsname.h>
UIDevice のエクステンションを作り、クラスプロパティ (計算型プロパティ) にしてしまうのが楽です。
import UIKit extension UIDevice { class var modelName: String { var systemInfo = utsname() uname(&systemInfo) let mirror = Mirror(reflecting: systemInfo.machine) let identifier = mirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8 where value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return identifier } }
あとは適当な場所で参照します。
func printModelName() { print("Model Name : \(UIDevice.modelName)") }
こんな感じで出力されます。
Model Name : iPhone6,1
Android の場合
Android は iOS に比べると簡単です。Build.MODEL
を参照するだけです。
private void printModel() { Log.i("DemoApp", "Model Name : " + Build.MODEL); }
こんな感じの出力結果になります。
07-06 14:32:40.790 31905-31905/jp.classmethod.sample.demoapp I/DemoApp: Model Name : Nexus 5X
まとめ
簡単ですが、モデル名についてのまとめでした。モデル名を取得する必要が出てきた時の参考にしてください。