LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログです。

デバイスサイズが異なるシミュレータで一度にアプリを起動して動作確認の効率を上げる

モバイルアプリエンジニアの山下です。

iPhone Xが発売されて4ヶ月が経とうとしてますが、iOSエンジニアにとっては確認する端末がまたひとつ増え苦労しています。

Xcode 9からシミュレータ自体の並行起動は可能になりましたが、アプリの実行は1つのシミュレータでしかできないため複数の端末で動作確認する際は1つずつ手動で切り替えて実行する必要がありました。

この確認作業はとても面倒ですし、都度ビルド時間が掛かるため塵も積もって大きなタイムロスになってしまいます。

そこで今回はFacebookが公開している FBSimulatorControl に含まれるコマンドラインツール 『fbsimctl』 を利用し、ターミナルからワンライナーで全てのデバイスサイズのシミュレータを同時起動できるようにしてみたいと思います。

fbsimctl インストール

Homebrewでインストールします。対応バージョンは Xcode 8以降になります。

$ brew tap facebook/fb
$ brew install fbsimctl --HEAD

org.carthage.CarthageKit/dependencies/GCDWebServer: Operation not permittedというエラーが出た場合は、一旦 Carthageをアンインストールするとインストールできます。

$ brew uninstall --force carthage
$ rm -rf ~/Library/Caches/org.carthage.CarthageKit

実行手順

シミュレータの起動からアプリを起動するまでの手順です。

シミュレータを起動

fbsimctl listでシミュレータ一覧を表示します。

$ fbsimctl list
3DC0B025-D2E2-4A06-B2A6-E99AB36D7D67 | iPhone X | Shutdown | iPhone X | iOS 11.2 | x86_64
0EB218F9-673C-4C5E-8380-3A0AF2EDFBC8 | iPhone SE | Shutdown | iPhone SE | iOS 11.2 | x86_64
9B9C6D4A-4FB9-483F-8227-8FB41B8683F2 | iPhone 8 Plus | Shutdown | iPhone 8 Plus | iOS 11.2 | x86_64
6B626E57-C1E2-4787-BF6A-93728E4CDE95 | iPhone 8 | Shutdown | iPhone 8 | iOS 11.2 | x86_64
...

fbsimctl <UDID> bootでシミュレータを起動します。fbsimctl listで表示された一覧の先頭の文字列がUDIDで複数渡すことで同時に起動させることができます。

$ fbsimctl 3DC0B025-D2E2-4A06-B2A6-E99AB36D7D67 0EB218F9-673C-4C5E-8380-3A0AF2EDFBC8 6B626E57-C1E2-4787-BF6A-93728E4CDE95 9B9C6D4A-4FB9-483F-8227-8FB41B8683F2 boot

.appのパスを取得

シミュレータへアプリをインストールするためには.appファイルが必要です。
以下のコマンドでビルドを行い、生成された.appファイルのパスを取得します。

$ xcodebuild -workspace <ワークスペース> -scheme <スキーム> -arch x86_64 -sdk iphonesimulator -configuration <Configuration> -showBuildSettings | grep -m 1 "CONFIGURATION_BUILD_DIR" | grep -oEi "\/.*"

/Users/XXX/Library/Developer/Xcode/DerivedData/<プロジェクト名>-dtjybaoudfhaodfetewcfjjbd/Build/Products/Test-iphonesimulator

シミュレータにアプリをインストール

前で生成した.appファイルをシミュレータへインストールします。

$ fbsimctl install /Users/XXX/Library/Developer/Xcode/DerivedData/<プロジェクト名>-dtjybaoudfhaodfetewcfjjbd/Build/Products/Test-iphonesimulator/<プロジェクト名>.app

アプリを起動

Bundle Identifierを指定してアプリを起動します。

$ fbsimctl launch <Bundle Identifier>

f:id:lcl-engineer:20180124124758g:plain

シェルスクリプトを作成

上記の操作だけでもアプリの起動まで簡単に行えますが、シェルスクリプトを作成してさらにラクをしたいと思います。
プロジェクトルートに以下のシェルスクリプトを作成します。ファイル名はlaunch_app.shにしました。

#!/usr/bin

PROJECT_NAME=$1
SCHEME_NAME=$2
BUNDLER_NAME=$3
CONFIGRATION=$4

# `.app`のパスを取得
APP_PATH=`xcodebuild -workspace ./${PROJECT_NAME}.xcworkspace -scheme ${SCHEME_NAME} -arch x86_64 -sdk iphonesimulator -configuration ${CONFIGRATION} -showBuildSettings | grep -m 1 "CONFIGURATION_BUILD_DIR" | grep -oEi "\/.*"`

fbsimctl install "${APP_PATH}/${PROJECT_NAME}.app"
fbsimctl launch ${BUNDLER_NAME}

シェルスクリプトを作成したらシミュレータを起動し、以下のコマンドで実行します。

$ sh ./launch_app.sh <プロジェクト名> <スキーマ> <Bundle Identifier> <Configuration>

例:  sh ./launch_app.sh test-app test-app-dev com.test-app development

これで1つのコマンドでアプリのインストールから起動まで行えます。
起動するデバイスサイズが毎回同じ場合は bootコマンドも含めると良いですね。

その他のコマンド

fbsimctl は他にもいくつかのコマンドがあります。

アプリ再起動

$ fbsimctl relaunch <Bundle Identifier>

シミュレータを閉じる

$ fbsimctl shutdown

ヘルプ

コマンドについて詳しくは以下のコマンドで表示できます。

$ fbsimctl help

最後に

今回の運用を始めてから確認作業に掛かっていた手間と時間が圧倒的に減りました。
fbsimctlはXCTestにも対応しているため、同様の操作でデバイスサイズごとのテストも一度に行えそうです。