xcrun simctl cloneは、既存のシミュレータデバイスをファイルシステムレベルで複製するサブコマンドである。

基本的な使い方

clone <device> <new name>の形式で実行する。

$ xcrun simctl clone "TIL Clone Source" "TIL Clone Dest"
E5C5CD67-BDF6-4AA4-9433-CC3F4530996C

標準出力には複製先デバイスのUUIDが出力される。 複製元・複製先ともsimctl list devicesで確認できる。

$ xcrun simctl list devices | grep "TIL Clone"
    TIL Clone Dest (E5C5CD67-BDF6-4AA4-9433-CC3F4530996C) (Shutdown)
    TIL Clone Source (2CC34CA2-ABEE-4B22-B2B4-A1D6FAF7D1FC) (Shutdown)

起動中のデバイスは複製できない

複製元のデバイスが起動中(Booted)の場合、cloneは明確なエラーで失敗する。

$ xcrun simctl boot "TIL Clone Source"
$ xcrun simctl clone "TIL Clone Source" "TIL Clone While Booted"
An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
Unable to clone device in current state: Booted

複製する前に、複製元のデバイスをshutdownしておく必要がある。

データディレクトリの内容がファイルシステムレベルで複製される

clone実行時点のデータディレクトリ(~/Library/Developer/CoreSimulator/Devices/<UDID>/data)の内容が、そのまま複製先にコピーされる。 複製元のデータディレクトリに直接ファイルを置いてから複製すると、複製先にも同じファイルが存在することを確認できる。

$ echo "til-clone-marker" > ~/Library/Developer/CoreSimulator/Devices/<複製元UUID>/data/til-clone-marker.txt

$ xcrun simctl clone "TIL Clone Source" "TIL Clone Dest"
2D118DC9-77C2-4D9B-ACAC-EF5196F233DC

$ cat ~/Library/Developer/CoreSimulator/Devices/2D118DC9-77C2-4D9B-ACAC-EF5196F233DC/data/til-clone-marker.txt
til-clone-marker

インストール済みアプリやアプリのデータも、このデータディレクトリ配下に置かれているため、複製先にそのまま引き継がれる。

一方、xcrun simctl status_barでiOSシミュレータのステータスバー表示を固定する で設定した上書き表示のような、CoreSimulatorがランタイム的に保持する設定は複製前後で確認できなかった。 ただし、これは同じデバイスをshutdownしてからbootし直した場合でも同様にリセットされる設定であり、clone特有の挙動ではない。

複製先の名前が既存デバイスと重複してもエラーにならない

xcrun simctl createでiOSシミュレータデバイスを新規作成する と同様、cloneの複製先名にも既存デバイスと同じ名前を指定できる。 エラーにはならず、別UUIDを持つデバイスとして作成される。

$ xcrun simctl clone "TIL Clone Source" "TIL Clone Dest"
9684A3F5-FBFF-4598-9400-6F71CBF8C3C6

$ xcrun simctl list devices | grep "TIL Clone Dest"
    TIL Clone Dest (9684A3F5-FBFF-4598-9400-6F71CBF8C3C6) (Shutdown)
    TIL Clone Dest (E5C5CD67-BDF6-4AA4-9433-CC3F4530996C) (Shutdown)

別のデバイスセットに複製する

第3引数<destination device set>にディレクトリパスを指定すると、通常のデバイス一覧(デフォルトのデバイスセット)とは別の場所にデバイスを複製できる。

$ mkdir -p /tmp/til-simctl-custom-deviceset
$ xcrun simctl clone "TIL Clone Source" "TIL Clone Custom Set" /tmp/til-simctl-custom-deviceset
E18ADCA7-0B2D-4604-ADD2-B2F977BD896B

複製先のデバイスは、デフォルトのデバイス一覧には表示されない。

$ xcrun simctl list devices | grep "TIL Clone Custom"
(何も表示されない)

--setオプションで複製先のデバイスセットを明示的に指定すると、そこに複製されたデバイスを確認できる。

$ xcrun simctl --set /tmp/til-simctl-custom-deviceset list devices
== Devices ==
...
    TIL Clone Custom Set (E18ADCA7-0B2D-4604-ADD2-B2F977BD896B) (Shutdown)

CI環境で実行ごとに独立したデバイスセットを使いたい場合など、通常のデバイス一覧を汚さずにデバイスを用意したいケースで活用できる。