xcrun simctl ioは、iOSシミュレータの画面をキャプチャするサブコマンドである。
screenshotオプションを使うと、シミュレータの画面をコマンドラインからPNGなどの画像ファイルとして保存できる。
基本的な使い方
保存先のパスを指定するだけで、シミュレータの画面をスクリーンショットとして保存できる。
デバイスはUDIDで指定するほか、起動中のデバイスであればbootedが使える。
$ xcrun simctl io booted screenshot screenshot.png
拡張子から画像フォーマットが自動判定され、既定ではPNGとして保存される。
画像フォーマットを指定する
--typeオプションで、png、tiff、bmp、gif、jpegのいずれかの形式を明示的に指定できる。
$ xcrun simctl io booted screenshot --type=jpeg screenshot.jpeg
iPhone 17シミュレータ(ライトモード、標準の文字サイズ)のホーム画面を同一条件で撮影してファイルサイズを比較すると、無圧縮のBMPが最も大きく、JPEGが最も小さくなる。
- PNG: 約2.9MB
- BMP: 約12.6MB
- JPEG: 約0.5MB
サイズを抑えたい場合はJPEGを、画質を優先する場合はPNGを選ぶとよい。
撮影するディスプレイを指定する
--displayオプションで、複数のディスプレイがある場合に撮影対象を指定できる。
利用可能なディスプレイはenumerateで確認できる。
$ xcrun simctl io booted enumerate
出力にはスクリーンごとのScreen IDやNameが含まれている。表示されたScreen IDまたは名前を--displayに指定する。
$ xcrun simctl io booted screenshot --display=1 screenshot.png
--displayを省略した場合は、デバイス本体の画面(LCD)が対象になる。
省略時はNote: No display specified. Defaulting to display: ... screenID: 1, name: LCDという案内が表示され、--display=1を指定した場合と同じ結果になる。
標準出力への出力は環境によって挙動が異なる
simctl help ioのヘルプには、保存先に-を指定すると標準出力に書き出せると記載されている。
しかしXcode 26.6で試したところ、-は標準出力ではなくカレントディレクトリの-という名前のファイルとして解釈され、標準出力には何も書き出されなかった。
標準出力へのリダイレクトを前提にしたスクリプトを書く場合は、実際の挙動を確認してから利用した方がよい。
活用例: UI設定を切り替えながらの自動撮影
xcrun simctl uiでダークモードや文字サイズなどのUI設定を切り替えてからscreenshotで撮影すれば、手動でシミュレータを操作せずに複数のUIパターンをまとめて収集できる。
$ xcrun simctl ui booted appearance dark
$ xcrun simctl io booted screenshot dark.png
$ xcrun simctl ui booted appearance light
$ xcrun simctl io booted screenshot light.png
CIに組み込めば、ダークモードや文字サイズごとのスクリーンショットをリリースのたびに機械的に収集できる。
