DeNA Testing Blog

Make Testing Fun, Smart, and Delighting End-Users

iOSデバイスの情報をアプリ内から取得する

こんにちは。SWETの加瀬(@Kesin11)です。
今回は、iOSデバイスの色々な情報をSwiftから取得するのに便利なLuminousというライブラリを紹介します。

デバイス情報の必要性

SWETではテスト自動化以外にもQAチームによるマニュアルテスト作業の効率化に取り組んでおり、その中でもバグチケットに記載されるデバイスの情報に着目しました。 開発者としては、バグが発生したときの検証デバイスのモデル名や、OSのバージョンといった情報は再現確認やデバッグのために貴重な情報です。

一方、QAチームは検証に使用したデバイスの情報を人力で記入しているという現状があるため、表記が微妙に統一されていなかったり、記載された情報が足りないというケースがありました。そのような場合には、開発者がQAチームに詳細を問い合わせるといったコミュニケーションコストが発生していました。

開発チームとQAチームにヒアリングをしたところ、以下の項目についてバグチケットに記載されていると助かるという回答が得られたため、これらの情報をアプリ内から取得する方法について調査してみました。

  • モデル名(iPhone 8、iPhone Xなどの名前)
  • OSバージョン
  • 画面解像度
  • メモリ
  • ストレージ空き容量

それぞれの項目についてSwiftから情報を取得することは可能なのですが、各情報を取得するためのクラスが別々だったりして少し面倒です。 今回、その面倒を解消してくれるLuminousという各種デバイス情報を取得するのに便利なライブラリを利用してみたのでその紹介をしたいと思います。

Luminous

Luminousはデバイスに関する各種情報を簡単に取得できるAPIを提供してくれるライブラリです。

以下は、前述の5項目についてLuminousを使って情報を取得してみた例です。

print("モデル名: \(Luminous.System.Hardware.Device.current.model)")
print("iOSバージョン: \(Luminous.System.Hardware.systemVersion)")

let nativeScreenBounds = Luminous.System.Hardware.Screen.nativeBounds
print("画面解像度: \(Int(nativeScreenBounds.width)) x \(Int(nativeScreenBounds.height))")

let totalMemoryMb = Int(Luminous.System.Hardware.physicalMemory(withSizeScale: .bytes) / 1024 / 1024)
print("メモリ: \(totalMemoryMb) MB")

let totalMemoryMbRounded = totalMemoryMb + 256 - (totalMemoryMb % 256)
print("メモリ(丸め): \(Int(totalMemoryMbRounded)) MB")

print("ストレージ空き容量: \(Luminous.System.Disk.freeSpace)")

// 実行結果
//
// モデル名: iPhone 6
// iOSバージョン: 10.1
// 画面解像度: 750 x 1334
// メモリ: 989 MB
// メモリ(丸め): 1024 MB
// ストレージ空き容量: 7.03 GB

メモリのところだけ補足をすると、実際に取得できる値はLuminous.System.Hardware.physicalMemoryによる989MBとなっており、残念ながら何らかの理由によってカタログスペックよりも低い値となってしまっています(iPhone 6のカタログスペックは1GB)。
そのため、256刻みで一番近いところに丸めた値も用意してみました。用途によると思いますが、カタログスペックと一致した値を表示させたい場合には上記のコードのように値を丸めてもいいかもしれません。

サンプルプロジェクト

Luminousでは他にも様々な情報を取得できます。他にどういった情報を取得できるのかはREADMEに記載されていますが、リポジトリにサンプルプロジェクトも同梱されているので、これをビルドして実際に確認することもできます。

サンプルプロジェクトをビルドして実機で動かすと以下のようにコンソールに表示されます(一部の情報については伏せています)。

以下の環境で実行した結果となります。

  • Xcode 9.3.1
  • Swift 3.3(現時点で古いですが、サンプルプロジェクトのBuild Settingsで設定されているため)
  • Luminous 1.0.2
  • iPhone 6(実機)
------------
Network
------------
isConnectedViaCellular: false
isConnectedViaWiFi: true
SSID: ****
------------
Locale
------------
currentCountry: en_JP
currentCurrency: JPY
currentCurrencySymbol: JP¥
currentLanguage: en-JP
currentTimeZone: Asia/Tokyo (current)
currentTimeZoneName: Asia/Tokyo
decimalSeparator: .
usesMetricSystem: true
------------
Carrier
------------
allowsVOIP: true
ISOCountryCode: jp
mobileCountryCode: 440
name: ****
networkCountryCode: 20
------------
Hardware
------------
bootTime: 47519.0146807917
physicalMemory: 1.08742e+15
processorsNumber: 2
systemName: iOS
systemVersion: 10.1
isLowPowerModeEnabled: false
------------
Screen
------------
bounds: (0.0, 0.0, 375.0, 667.0)
brightness: 0.255796
isScreenMirrored: false
nativeBounds: (0.0, 0.0, 750.0, 1334.0)
nativeScale: 2.0
bounds: 2.0
------------
Device
------------
current: Deviice
Identifier: iPhone7,2
Type: iPhone6
Model name: iPhone 6
Connectivity: wiFi4G
Screen size: screen4Dot7Inches
identifierForVendor: 1E75D506-AF8D-4743-A0DE-23574EBF75F8
orientation: UIDeviceOrientation
------------
Accessory
------------
2018-05-22 19:10:47.888318 Luminous_Example[630:247318] Couldn't find the "com.apple.private.externalaccessory.showallaccessories" entitlement
connectedAccessories: []
connectedAccessoriesNames: []
count: 0
isHeadsetPluggedIn: false
------------
Sensors
------------
isAccelerometerAvailable : true
isGyroAvailable : true
isMagnetometerAvailable : true
isDeviceMotionAvailable : true
------------
Disk
------------
freeSpace: 7.03 GB
freeSpaceInBytes: 7548157952
totalSpace: 11.21 GB
totalSpaceInBytes: 12039397376
usedSpace: 4.18 GB
usedSpaceInBytes: 4491239424
freeSpaceInPercentage: 62.6955%
usedSpaceInPercentage: 37.3045%
------------
Battery
------------
level: 99.0
state: charging
------------
Application
------------
clipboardString: test
version: 1.0

Luminousを使うときには、このサンプルプロジェクトの表示を見ながら必要なコードを見つけるのが早いでしょう。

サンプルプロジェクトの注意点

残念ながら、バージョン1.0.2現在ではサンプルプロジェクトをビルドするとエラーになってしまいます。

対処法として、Build Phases > Link Binary With Librariesの設定にExternalAccessory.frameworkを追加するか、このフレームワークが必要な該当コードをコメントアウトすることで正常にビルドできるようになります。
この記事を書いている途中にpull requestを送っておいたので、もしかしたら記事が公開される頃には修正されているかもしれません。

その他の注意点としては、プロジェクトの署名に作者のプロビジョニングプロファイルが設定されているので、自分の実デバイスで実行したい場合には実機デバッグができるように署名の設定を変える必要があります。

まとめ

Luminousというライブラリを使ってデバイス情報を取得する方法の紹介をしました。

今回はiOSデバイスについて紹介しましたが、Androidでも同様にモデル名やOSバージョンに限らず、様々な情報が取得可能です。
そちらについても近いうちにまたご紹介していきたいと思いますのでお楽しみに!