xcrun simctl runtimeadddeleteを使うと、xcrun simctl runtime listでインストール済みのiOSシミュレータランタイムを確認する で確認できるランタイムディスクイメージを、コマンドラインから追加・削除できる。

ランタイムを削除する

deleteにランタイムのUUIDを指定すると削除できる。 削除は実際にディスク容量を解放する操作のため、--dry-runで対象を確認してから実行するとよい。

$ xcrun simctl runtime delete 88EADE1A-9246-4A89-85D2-99CF52F98EAB --dry-run
Would delete D: 88EADE1A-9246-4A89-85D2-99CF52F98EAB iOS (17.5 - 21F79) (Ready)

問題なければ--dry-runを外して実行する。 このとき--keep-assetオプションを付けると、ディスクイメージ自体は削除されるが、関連するmobile assetは残る。

$ xcrun simctl runtime delete 88EADE1A-9246-4A89-85D2-99CF52F98EAB --keep-asset

実際に7個・53.8Gあったランタイムのうち1個(iOS 17.5、7.34G)を削除したところ、runtime listの合計サイズが47.0Gに減った。 削除はすぐには完了せず、実行直後はDeletingという状態になり、数秒待ってからruntime listで確認すると一覧から消えていた。

ランタイムを追加する

addにディスクイメージ(.dmg)のパスを指定すると、ランタイムを追加できる。 ディスクイメージはxcodebuild -downloadPlatform iOS -exportPath <保存先> -buildVersion <バージョン>で取得できる。

$ xcodebuild -downloadPlatform iOS -exportPath ~/Downloads -buildVersion 17.5

実際に試したところ、このxcodebuild -downloadPlatformはダウンロードと同時に取得したランタイムを自動的にインストールしてしまう。 addコマンド自体の動作を確認したい場合は、自動インストールされたランタイムを一度deleteで削除してから、ダウンロード済みの.dmgファイルを使ってaddを実行し直す必要がある。 以下は、そのようにしてadd単体の動作を確認した際の出力である。

$ xcrun simctl runtime add ~/Downloads/iphonesimulator_17.5_21F79.dmg
D: ADA04399-8281-4C80-87E2-ADDC0FAC53D1 iOS (17.5 - 21F79) (Mounting)
D: ADA04399-8281-4C80-87E2-ADDC0FAC53D1 iOS (17.5 - 21F79) (Ready)

実行結果としてMountingからReadyへの状態遷移が標準出力に表示され、runtime listで確認すると新しいUUIDでランタイムが追加されていた。 7.3Gのディスクイメージを追加した後も、runtime listの合計サイズは元と同じ53.8Gのままだった。 dfなど実際のディスク使用量までは確認していないが、runtime listの合計サイズ表示上は増加が見られず、ヘルプに記載されている「可能な場合はイメージファイルをクローンし追加のディスク容量を使わない」という説明と矛盾しない結果だった。

追加後に元のファイルを削除する

--moveオプションを付けると、追加が成功した場合に限り、元の.dmgファイルが削除される。

$ xcrun simctl runtime add ~/Downloads/iphonesimulator_17.5_21F79.dmg --move

実際に試したところ、コマンド実行後に元の.dmgファイルが存在しなくなっていることを確認した。 ダウンロードした.dmgファイルをそのまま残しておく必要がない場合、ディスク容量を節約できる。

使われていないランタイムをまとめて削除する

--notUsedSinceDaysオプションで、指定した日数以上使われていないランタイムをまとめて削除できる。

$ xcrun simctl runtime delete --notUsedSinceDays 1 --dry-run

実際に試したところ、--notUsedSinceDaysに大きな値(例えば9999)を指定すると対象が見つからず、小さい値(例えば1)を指定すると対象が見つかるという結果になった。 「最後に使われてから指定日数が経過したランタイム」が削除対象になるため、日数を大きくするほど対象は絞り込まれる(それだけ長期間使われていないランタイムしか該当しなくなる)。 なお0を指定するとInvalid days: 0というエラーになり、1以上の値を指定する必要がある。

allという特別な識別子を使うと、インストール済みの全ランタイムを削除対象にできる。

$ xcrun simctl runtime delete all --dry-run

allは非常に強力なオプションのため、--dry-runを外す前に対象を必ず確認した方がよい。

活用例: 古いランタイムを整理するスクリプト

複数バージョンのXcodeを使い分けていると、使わなくなった古いランタイムがディスク容量を圧迫しがちである。 --notUsedSinceDays--dry-runを組み合わせれば、しばらく使っていないランタイムを定期的に洗い出し、確認した上でまとめて削除するスクリプトを作れる。

$ xcrun simctl runtime delete --notUsedSinceDays 90 --dry-run

CIのメンテナンスジョブに組み込めば、ディスク容量の圧迫を防ぐためのランタイム整理を定期的に自動化できる。