モバイルアプリエンジニアの山下です。
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>
シェルスクリプトを作成
上記の操作だけでもアプリの起動まで簡単に行えますが、シェルスクリプトを作成してさらにラクをしたいと思います。
プロジェクトルートに以下のシェルスクリプトを作成します。ファイル名は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にも対応しているため、同様の操作でデバイスサイズごとのテストも一度に行えそうです。