xcrun simctl rebootは、シミュレータデバイスを再起動するサブコマンドである。

参考: xcrun simctl boot/shutdownでiOSシミュレータデバイスを起動・終了する

基本的な使い方

reboot <device>の形式で実行する。 ヘルプによると、内部的には対象デバイスをshutdownしてからbootし直す処理である。

$ xcrun simctl reboot "TIL Reboot iPhone"
$ xcrun simctl list devices | grep "TIL Reboot iPhone"
    TIL Reboot iPhone (8BD8A65F-E79E-4922-A3C1-2176F5CD7A24) (Booted)

boot/shutdownと同じくSIMCTL_CHILD_プレフィックス付きの環境変数を渡すと、プレフィックスを除いた名前で再起動後のデバイス内プロセスに引き継がれる。

対象デバイスは起動中(Booted)である必要がある

rebootshutdownしてからbootし直す処理であるため、起動していないデバイスに対して実行するとエラーになる。

$ xcrun simctl shutdown "TIL Reboot iPhone"
$ xcrun simctl reboot "TIL Reboot iPhone"
An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
Unable to shutdown device in current state: Shutdown

エラーメッセージがshutdown失敗のものになっており、rebootが内部でshutdownを呼び出していることがうかがえる。 シャットダウン済みのデバイスを起動したいだけの場合はbootを使う必要がある。

アプリのプロセスは再起動で終了するが、インストール済みアプリやデータは保持される

参考: xcrun simctl eraseでiOSシミュレータデバイスの内容を初期化する

rebootはデバイスを一度シャットダウンするため、実行中だったアプリのプロセスは終了する。 一方eraseとは異なり、インストール済みアプリやアプリデータ自体は初期化されず、再起動後もそのまま残る。

$ xcrun simctl launch "TIL Reboot iPhone" com.apple.mobilesafari
com.apple.mobilesafari: 50831

$ echo "persist-test" > "$(xcrun simctl get_app_container "TIL Reboot iPhone" com.apple.mobilesafari data)/Documents/test.txt"

$ xcrun simctl reboot "TIL Reboot iPhone"

$ ps aux | grep MobileSafari.app/MobileSafari
(該当プロセスなし、アプリは終了している)

$ cat "$(xcrun simctl get_app_container "TIL Reboot iPhone" com.apple.mobilesafari data)/Documents/test.txt"
persist-test

rebootコマンド自体の完了と、デバイスの起動完了は別である

参考: xcrun simctl listでiOSシミュレータのデバイス・ランタイム一覧を絞り込む

rebootコマンドが終了しlist devicesBootedと表示された時点でも、bootstatusで確認すると内部的な起動処理がまだ続いている場合がある。

$ xcrun simctl reboot "TIL Reboot iPhone"
$ xcrun simctl list devices | grep "TIL Reboot iPhone"
    TIL Reboot iPhone (...) (Booted)

$ xcrun simctl bootstatus "TIL Reboot iPhone"
Monitoring boot status for TIL Reboot iPhone (...).
[...] Status=4, isTerminal=NO, Elapsed=00:09.
	Waiting on System App
...
[...] Status=4294967295, isTerminal=YES, Elapsed=00:17.
	Finished

再起動直後にアプリをlaunchするなど、デバイスの完全な起動を前提にした操作をしたい場合は、rebootの完了だけで判断せずbootstatusで起動完了を待つ方が確実である。