[iOS][Android][Tips] デバイスモデル名を取得する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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,1iPhone7,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

まとめ

簡単ですが、モデル名についてのまとめでした。モデル名を取得する必要が出てきた時の参考にしてください。