xcrun simctl ioは、iOSシミュレータの画面をキャプチャするサブコマンドである。 screenshotオプションを使うと、シミュレータの画面をコマンドラインからPNGなどの画像ファイルとして保存できる。

基本的な使い方

保存先のパスを指定するだけで、シミュレータの画面をスクリーンショットとして保存できる。 デバイスはUDIDで指定するほか、起動中のデバイスであればbootedが使える。

$ xcrun simctl io booted screenshot screenshot.png

拡張子から画像フォーマットが自動判定され、既定ではPNGとして保存される。

画像フォーマットを指定する

--typeオプションで、pngtiffbmpgifjpegのいずれかの形式を明示的に指定できる。

$ 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 IDNameが含まれている。表示された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に組み込めば、ダークモードや文字サイズごとのスクリーンショットをリリースのたびに機械的に収集できる。