simctl
コマンドの事は知ってはいたのですが、詳細を把握していなかったので
一つ一つサブコマンドを実行して確かめてみました。
[Update]本記事はXcode13.2.1に付属するsimctlを使って確認しています。
#simctlとは
Xcodeに含まれる標準CLIツールで、主にシミュレータの管理を行うための機能を備えています。
#simctlサブコマンド
simctl
は単体で実行することはできず、サブコマンドで様々な機能を実行する事が出来ます。
help
ではまずxcrun simctl help
でsimctl
にどの様なサブコマンドがあるか確認してみます。
usage: simctl [--set <path>] [--profiles <path>] <subcommand> ...
simctl help [subcommand]
Command line utility to control the Simulator
For subcommands that require a <device> argument, you may specify a device UDID
or the special "booted" string which will cause simctl to pick a booted device.
If multiple devices are booted when the "booted" device is selected, simctl
will choose one of them.
Subcommands:
create Create a new device.
clone Clone an existing device.
upgrade Upgrade a device to a newer runtime.
delete Delete specified devices, unavailable devices, or all devices.
pair Create a new watch and phone pair.
unpair Unpair a watch and phone pair.
pair_activate Set a given pair as active.
erase Erase a device's contents and settings.
boot Boot a device or device pair.
shutdown Shutdown a device.
rename Rename a device.
getenv Print an environment variable from a running device.
openurl Open a URL in a device.
addmedia Add photos, live photos, videos, or contacts to the library of a device.
install Install an app on a device.
uninstall Uninstall an app from a device.
get_app_container Print the path of the installed app's container
install_app_data Install an xcappdata package to a device, replacing the current contents of the container.
launch Launch an application by identifier on a device.
terminate Terminate an application by identifier on a device.
spawn Spawn a process by executing a given executable on a device.
list List available devices, device types, runtimes, or device pairs.
icloud_sync Trigger iCloud sync on a device.
pbsync Sync the pasteboard content from one pasteboard to another.
pbcopy Copy standard input onto the device pasteboard.
pbpaste Print the contents of the device's pasteboard to standard output.
help Prints the usage for a given subcommand.
io Set up a device IO operation.
diagnose Collect diagnostic information and logs.
logverbose enable or disable verbose logging for a device
status_bar Set or clear status bar overrides
ui Get or Set UI options
push Send a simulated push notification
privacy Grant, revoke, or reset privacy and permissions
keychain Manipulate a device's keychain
一つずつ見ていきましょう。
list
まずサブコマンドlist
を試していきましょう。
list
から見ておくと他のサブコマンドで必要となるパラメタが分かりやすくなります。
List available devices, device types, runtimes, or device pairs.
Usage: simctl list [-j | --json] [-v] [devices|devicetypes|runtimes|pairs] [<search term>|available]
-j Print as JSON
-v More verbose output
Specify one of 'devices', 'devicetypes', 'runtimes', or 'pairs' to list only items of that type. If a type filter is specified you may also specify a search term. Search terms use a simple case-insensitive contains check against the item's description. You may use the search term 'available' to only list available items.
それでは実行してみましょう
xcrun simctl list
以下の様な出力が得られたかと思います。
== Device Types ==
iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s)
...
iPhone 7 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus)
== Runtimes ==
iOS 8.1 (8.1 - 12B411) (com.apple.CoreSimulator.SimRuntime.iOS-8-1)
...
iOS 10.2 (10.2 - 14C89) (com.apple.CoreSimulator.SimRuntime.iOS-10-2)
== Devices ==
-- iOS 7.1 --
-- iOS 8.1 --
-- iOS 8.2 --
-- iOS 8.4 --
-- iOS 9.0 --
iPhone 6s (F4CDAEBA-XXXX-4195-XXXX-11A4C27104B9) (Shutdown)
-- iOS 10.2 --
iPhone 7 (31433DE1-XXXX-45D6-XXXX-6EABB3267930) (Shutdown)
...
iPad Pro (12.9 inch) (6C6A46DA-XXXX-4E6A-XXXX-6D60757CB4AD) (Shutdown)
-- tvOS 10.1 --
Apple TV 1080p (63349A78-XXXX-4EB0-XXXX-0D470E3C2404) (Shutdown)
-- watchOS 3.1 --
Apple Watch Series 2 - 38mm (A097C17C-XXXX-4921-XXXX-39789FEC8367) (Shutdown)
Apple Watch Series 2 - 42mm (6A8DEC7F-XXXX-4CA8-XXXX-1AADB91D3B18) (Shutdown)
-- Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-10-1 --
iPhone 7 Plus (D07F86FF-XXXX-4BF1-XXXX-8FFD4C4EA321) (Creating) (unavailable, runtime profile not found)
...
== Device Pairs ==
8E098274-XXXX-4CBC-XXXX-C7561DFB3CDE (active, disconnected)
Watch: Apple Watch Series 2 - 38mm (A097C17C-XXXX-4921-XXXX-39789FEC8367) (Shutdown)
Phone: iPhone 7 (31433DE1-XXXX-45D6-XXXX-6EABB3267930) (Shutdown)
...
05DCD907-XXXX-4FC6-XXXX-E4B6C645285F (unavailable)
Watch: Apple Watch Series 2 - 42mm (42D6B464-XXXX-42DC-XXXX-0197328E532A) (Shutdown)
Phone: iPhone 7 Plus (FAF1B9DF-XXXX-47A5-XXXX-C0A80B424314) (Shutdown)
インストールされてるシミュレータのランタイムなどは/Library/Developer/CoreSimulator/Profiles/Runtimes/
に入っています。
Device TypesとRuntimes
Device Types
はXcodeで扱えるシミュレータタイプの一覧です。
Runtimes
はシミュレータで動作させる事のできるRuntimeの一覧です。
Xcodeでシミュレータを追加する際に選択するDevice Type
とOS Version
と同じものが表示されているはずです。
Devices
Devices
は現在インストール済みのシミュレータの一覧になります。
Device Pairs
Device Pairs
はiPhoneとWatchのシミュレータのペアの一覧です。
XcodeでもWatchとのペアは確認できますが、一覧性としては個別にSimulatorを選択しなければならないXcodeのDevices画面よりsimctl list
の方が分かりやすそうですね。
device
/device type id
/runtime id
/pair UUID
について
simctl
コマンドでは実行時にdevice type id
やruntime id
を指定する必要がある場合があります。
これらはlist
で表示される一覧からも確認する事ができます。
device
はシミュレータを一意に表すUDIDです。
-- iOS 9.0 --
iPhone 6s (F4CDAEBA-XXXX-XXXX-XXXX-11A4C27104B9) (Shutdown)
-- iOS 10.2 --
iPhone 5 (BA4350E7-XXXX-XXXX-XXXX-E6C96F29DFFE) (Booted)
Shutdown
やBooted
の状態があり、device id
をパラメタとして与える場合、
booted
を指定する事で起動してるシミュレータを指定することができます。
複数のシミュレータが起動している場合、その中から1つが選ばれます。
試してみた感じだと起動しているシミュレータの中で端末タイプが一番新しいものが選ばれてる様に見えました。
device type id
であれば対象の端末の()で囲まれているcom.apple.CoreSimulator.SimDeviceType.***
がそれにあたります。
iPhone 7 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus)
runtime id
についても同様に対象のランタイムの()で囲まれているxx.x - XXXXX
がそれにあたります。
iOS 10.2 (10.2 - 14C89) (com.apple.CoreSimulator.SimRuntime.iOS-10-2)
pair UUID
は== Device Pairs ==
の一覧で先頭から8E098274-XXXX-XXXX-XXXX-C7561DFB3CDE (active, disconnected)
の様な形で始まるID((active, disconnected)
除く)がそれにあたります。
== Device Pairs ==
8E098274-XXXX-XXXX-XXXX-C7561DFB3CDE (active, disconnected)
Watch: Apple Watch Series 2 - 38mm (A097C17C-XXXX-XXXX-XXXX-39789FEC8367) (Shutdown)
Phone: iPhone 7 (31433DE1-XXXX-XXXX-XXXX-6EABB3267930) (Shutdown)
一覧対象の絞り込み
devices``devicetypes``runtimes``pairs
のいずれかを指定すると、
list
の出力を絞り込む事ができます。
xcrun simctl list runtimes
さらに特定のワードをその後に指定することで更なる絞り込みができます。available
/unavailable
/booted
xcrun simctl list devices booted
一覧をjson形式で取得する
-j
または--json
オプションの指定で一覧をjson形式で出力する事ができます。
xcrun simctl list -j
create
createサブコマンドはシミュレータの生成を行います。
実行のためのパラメタは以下の様な条件になります。
xcrun simctl create <name> <device type id> <runtime id>
各オプションの内容は以下の通りです。
オプション | 説明 |
---|---|
name | 生成するデバイス名 |
device type id | どの端末(iPhone 7やiPad Airなど)をidで指定します |
runtime id | ランタイム(iOS 9やwatchOS 3.1など)をidで指定します |
device type id
やruntime id
に何を指定して良いかわからない場合は、
前述したxcrun simctl list
コマンドを使って、
自分が指定したい値を調べましょう。
例えば、iPhon4s(iOS9.0)のシミュレータが欲しい場合、以下の様なパラメタで入力します。
$ xcrun simctl create iPhone4s com.apple.CoreSimulator.SimDeviceType.iPhone-4s 9.0 - 13A344
clone
clone
は既にインストールされているシミュレータをコピーして新しいシミュレータを作ります。
Usage: simctl clone <device> <new name>
$ xcrun simctl clone 8C379DAA-XXXX-XXXX-XXXX-277DDDDC5CCD iPhone4sClone
upgrade
upgrade
は対象のシミュレータのランタイムをアップグレードする事ができます。
以下は例として
8.4
のシミュレータを新規に作成し、その後10.2
にアップグレードしたものです。
$ xcrun simctl create iPhone5_8.4 com.apple.CoreSimulator.SimDeviceType.iPhone-5 8.4 - 12H141
F1049121-XXXX-XXXX-XXXX-83A0630EB1EC
$ xcrun simctl upgrade F1049121-XXXX-XXXX-XXXX-83A0630EB1EC 10.2 - 14C89
注意 ダウングレードは出来ません
delete
delete
で対象のシミュレータを削除します
Usage: simctl delete <device> [... <device n>] | unavailable
$ xcrun simctl delete 8C379DAA-XXXX-XXXX-XXXX-277DDDDC5CCD
pair
pair
はシミュレータのiPhoneとWatchをペアリングさせます。
Usage: simctl pair <watch device> <phone device>
$ xcrun simctl pair A097C17C-XXXX-XXXX-XXXX-39789FEC8367 31433DE1-XXXX-XXXX-XXXX-6EABB3267930
F7B77F71-XXXX-XXXX-XXXX-473FB6BFE41E ← pair uuid
unpair
unpair
はシミュレータのiPhoneとWatchをペアリングを解除させます。
Usage: simctl unpair <pair UUID>
パラメタとしてはpair UUID
を指定します。
$ xcrun simctl unpair 8E098274-XXXX-XXXX-XXXX-C7561DFB3CDE
erase
erase
で対象のシミュレータのコンテンツと設定をリセットします。
リセットするシミュレータはShutdown
状態である必要があります。
Usage: simctl erase <device> [... <device n>] | all
$ xcrun simctl erase 8E098274-XXXX-XXXX-XXXX-C7561DFB3CDE
または
$ xcrun simctl erase all
このコマンドはSimulator.appの'Reset Content and Settings...'に相当します。
boot
boot
でシミュレータを起動します。
Usage: simctl boot <device>
コマンドを実行するとシミュレータが起動する事がわかります。
ただし、GUIは起動しません。
list
サブコマンドで対象のシミュレータが(Shutdown)
から(Booted)
に変わる事が確認できます。
$ xcrun simctl list | grep 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
iPhone SE HOGE (30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF) (Shutdown) ←
$ xcrun simctl boot 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF)
$ xcrun simctl list | grep 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
iPhone SE HOGE (30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF) (Booted) ←
GUIでの起動はSimulator.app
を使います
$ open -a "Simulator" --args -CurrentDeviceUDID 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
boot
では複数のシミュレータを起動状態にする事ができますが、
GUIを使った場合ではできません。
また、既にsimctl
で起動済みのものをSimulator.app
で起動することもできません。
shutdown
shutdown
で対象のシミュレータを終了させます。
$ xcrun simctl shutdown 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
rename
rename
で対象のシミュレータ名を変更できます。
Usage: simctl rename <device> <name>
$ xcrun simctl rename 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF RenamediPhone
getenv
getenv
でシミュレータの環境変数をコンソールに出力する事ができます。
Usage: simctl getenv <device> <variable name>
$ xcrun simctl getenv 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF PATH
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/sbin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/sbin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/local/bin
$ xcrun simctl getenv 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF SIMULATOR_UDID
30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
$ xcrun simctl getenv 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF HOME
~/Library/Developer/CoreSimulator/Devices/30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF/data
おまけ
<variable name>
で指定する環境変数ですが、私は何が指定できるのかわからなかったので調べて見たのですが、
ProcessInfo().environment.keys
あたりで得られる値が設定できるようでした。
以下は適当にサンプルとして作ったプロジェクトの起動時にProcessInfo().environment.keys
を出力した結果です。
CFFIXED_USER_HOME
CLASSIC
CUPS_SERVER
DYLD_FALLBACK_FRAMEWORK_PATH
DYLD_FALLBACK_LIBRARY_PATH
DYLD_FRAMEWORK_PATH
DYLD_LIBRARY_PATH
DYLD_ROOT_PATH
DYLD_SHARED_REGION
HOME
IOS_SIMULATOR_SYSLOG_SOCKET
IPHONE_SHARED_RESOURCES_DIRECTORY
IPHONE_SIMULATOR_CLASS
IPHONE_SIMULATOR_ROOT
IPHONE_TVOUT_EXTENDED_PROPERTIES
NSUnbufferedIO
OS_ACTIVITY_DT_MODE
PATH
SIMULATOR_CAPABILITIES
SIMULATOR_DEVICE_NAME
SIMULATOR_EXTENDED_DISPLAY_PROPERTIES
SIMULATOR_HOST_HOME
SIMULATOR_LEGACY_ASSET_SUFFIX
SIMULATOR_LOG_ROOT
SIMULATOR_MAINSCREEN_HEIGHT
SIMULATOR_MAINSCREEN_PITCH
SIMULATOR_MAINSCREEN_SCALE
SIMULATOR_MAINSCREEN_WIDTH
SIMULATOR_MEMORY_WARNINGS
SIMULATOR_MODEL_IDENTIFIER
SIMULATOR_PLATFORM_RUNTIME_OVERLAY_ROOT
SIMULATOR_PRODUCT_CLASS
SIMULATOR_ROOT
SIMULATOR_RUNTIME_BUILD_VERSION
SIMULATOR_RUNTIME_VERSION
SIMULATOR_SHARED_RESOURCES_DIRECTORY
SIMULATOR_UDID
SIMULATOR_VERSION_INFO
TESTMANAGERD_SIM_SOCK
TMPDIR
XPC_FLAGS
XPC_SERVICE_NAME
XPC_SIMULATOR_LAUNCHD_NAME
__XCODE_BUILT_PRODUCTS_DIR_PATHS
__XPC_DYLD_FRAMEWORK_PATH
__XPC_DYLD_LIBRARY_PATH
このほかCFLOG_FORCE_STDERR
やIPHONE_SIMULATOR_DEVICE
なども
指定できるようでした。
この辺の詳しいドキュメント知ってる方がいたら教えて欲しいです。m(_ _)m
openurl
openurl
でMobileSafariで対象のURLを開く事ができます。
対象のシミュレータはBooted
状態になっている必要があります。
Usage: simctl openurl <device> <URL>
GUIがないとわかりにくですが、実行後にSimulator.appでSafariを開くと、
対象のURLが履歴に残っている事でURLを開いたことを確認できます。
$ xcrun simctl boot 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
$ xcrun simctl openurl 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF http://qiita.com
$ xcrun simctl shutdown 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
$ open -a "Simulator" --args -CurrentDeviceUDID 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
addmedia
addmedia
はシミュレータへの写真、Live Photo、動画をカメラライブラリに追加する事が出来ます。
テスト用画像データの登録などに使えそうですね。
Usage: simctl addmedia <device> <path> [... <path>]
$ xcrun simctl addmedia 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF foo.jpg bar.mov
install
install
はシミュレータにアプリをインストールする事が出来ます。
Usage: simctl install <device> <path>
適当なアプリをビルドしてインストールする場合このようになります。
$ cd SampleApp/
$ xcodebuild -sdk iphonesimulator build -configuration Debug
// これでbuild/Debug-iphonesimulator/SampleApp.appが出来たはずなのでinstallコマンドのパラメタで指定します。
$ xcrun simctl install 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF build/Debug-iphonesimulator/SampleApp.app
uninstall
uninstall
ではシミュレータからアプリを削除する事が出来ます。
Usage: simctl uninstall <device> <app identifier>
以下のように実行します。install
の時はファイルを指定しましたが、uninstall
の場合は
アプリのBundle Identifier
を指定します。
$ xcrun simctl uninstall 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF com.foo.SampleApp
get_app_container
get_app_container
コマンドはシミュレータ上にインストールされたアプリのパスを出力する事が出来ます。
Usage: simctl get_app_container <device> <app identifier>
$ xcrun simctl get_app_container booted com.foo.SampleApp
~/Library/Developer/CoreSimulator/Devices/30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF/data/Containers/Bundle/Application/30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF/SampleApp.app
launch
launch
はシミュレータ上でアプリの起動を行う事が出来ます。
Usage: simctl launch [-w | --wait-for-debugger] [--console] [--stdout=<path>] [--stderr=<path>] <device> <app identifier> [<argv 1> <argv 2> ... <argv n>]
--console Block and print the application's stdout and stderr to the current terminal.
Signals received by simctl are passed through to the application.
(Cannot be combined with --stdout or --stderr)
--stdout=<path> Redirect the application's standard output to a file.
--stderr=<path> Redirect the application's standard error to a file.
Note: Log output is often directed to stderr, not stdout.
If you want to set environment variables in the resulting environment, set them in the calling environment with a SIMCTL_CHILD_ prefix.
$xcrun simctl launch 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF com.foo.SampleApp
com.foo.SampleApp: 12345
launch
コマンドのオプションについては以下のようなものがあります。
-w or --wait-for-debugger
launch
のオプションで-w
または--wait-for-debugger
を使用した場合、
アプリ起動時にデバッガーがアタッチされるまで処理を待ってくれるようです。
例えば-w
オプションをつけてlaunch
させ、XcodeでAttach Process
で対象アプリのプロセスをアタッチ後、処理が走ります。
UIApplicationDelegate
のapplication(_:didFinishLaunchingWithOptions:)
内にブレイクポイントをつけて試してみました。アプリ起動時に走る処理なので起動時にデバッガがアタッチされるのを待っていなければ、処理は即時実行されアタッチしても対象のブレイクポイントはすでに通過してしまっているわけです。
結果としては想定した通りアタッチ後にブレイクポイントで処理が止まりました👏
--console
コンソールへの出力をこのコマンドを実行しているターミナル上に出力します。
試しにUIApplicationDelegate
のapplication(_:didFinishLaunchingWithOptions:)
にprint(#function)
を入れて実行してみました。
xcrun simctl launch --console 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF com.foo.SampleApp
com.foo.SampleApp: 93567
application(_:didFinishLaunchingWithOptions:) <- printの出力結果
terminate
terminate
コマンドはシミュレータ上で起動しているアプリを終了させる事が出来ます。
Usage: simctl terminate <device> <app identifier>
$ xcrun simctl terminate 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF com.foo.SampleApp
icloud_sync
icloud_sync
コマンドはiCloudの同期するトリガ起こす事が出来ます。
シミュレータへのiCloudのログインは実機と同様に行う必要があります
Usage: simctl icloud_sync <device>
$ xcrun simctl icloud_sync booted
pbcopy
pbcopy
コマンドは標準入力の値をシミュレータのペーストボードにコピーします。
Usage: simctl pbcopy [-v] <device or "host">
以下の様に標準入力を与えて、シミュレータ側のブラウザなどを使って、
適当な入力欄でpaste
をするとfoo
がペーストされるはずです。
$ echo foo | xcrun simctl pbcopy 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
ただ、私が試した際、この方法でペーストボードに値をコピーしても
UIPasteboardChanged
の通知は発生しませんでした。
pbpaste
pbpaste
コマンドはシミュレータのペーストボードの値をホスト側のペーストボードに保存します。
Usage: simctl pbpaste [-v] <device or "host">
例えばシミュレータ上のSafariなどでテキストを選択&コピーして
pbpaste
を実行するとその内容が出力されることが確認できます。
$ xcrun simctl pbpaste 30C0730C-XXXX-XXXX-XXXX-03508FFAFEBF
foo
UIPasteboard.general.string = "test"
の様にUIPasteboard
に
設定された値ももちろんpbpaste
で出力することができます。
pbsync
pbsync
コマンドはペーストボードの値を他のシミュレータに同期させる事が出来ます。
Usage: simctl pbsync [-pv] <source device or "host"> <destination device or "host">
$ xcrun simctl pbsync host booted
pbinfo
pbinfo
コマンドで対象のペーストボードの値を出力します。
Usage: simctl pbinfo <device or "host">
$ xcrun simctl pbinfo booted
preferred types = (
"public.rtf",
"dyn.ah62d4rv4gk81g7d3ru",
"public.utf16-external-plain-text",
"dyn.ah62d4rv4gk81n65yru",
"com.apple.traditional-mac-plain-text",
"public.utf8-plain-text"
)
values = {
public.rtf : Promised by SimDevicePasteboardItem
dyn.ah62d4rv4gk81g7d3ru : Promised by SimDevicePasteboardItem
public.utf16-external-plain-text : Promised by SimDevicePasteboardItem
dyn.ah62d4rv4gk81n65yru : Promised by SimDevicePasteboardItem
com.apple.traditional-mac-plain-text : Promised by SimDevicePasteboardItem
public.utf8-plain-text : Promised by SimDevicePasteboardItem
}
io
io
コマンドはシミュレータのスクリーンショットやスクリーンの動画を出力することができます。
Usage: simctl io <device> <operation> <arguments>
Supported operations:
enumerate [--poll]
Lists all available IO ports and descriptor states.
--poll Poll after enumeration.
poll
Polls all available IO ports for events.
recordVideo [--type=<type>] [--display=<display>] <file>
Records the main framebuffer display to the specified file (use "-" for stdout).
--type "h264", "mp4" or "fmp4". Default is "mp4".
screenshot [--type=<type>] [--display=<display>] [<file>]
Saves a screenshot as a PNG to the specified file (use "-" for stdout).
If no file is specified a default filename will be used.
--type Can be "png", "tiff", "bmp", "gif", "jpeg". Default is png.
--display iOS: supports "main" or "tv". Default is "main".
tvOS: supports only "tv"
watchOS: supports only "main"
Example:
Save a screenshot of the booted device to screenshot.png:
simctl io booted screenshot screenshot.png
Pipe fragmented mp4 video of the booted device to another program:
simctl io booted recordVideo --type=fmp4 - | <other program>
enumerate
enumerate
オプションで利用可能なすべてのIOポートとディスクリプタの状態を一覧表示する事が出来ます。
$ xcrun simctl io booted enumerate
Port:
UUID: 28CCC55A-XXXX-XXXX-XXXX-9A02451B1EA4
Power state: On
Display class: 0
Default width: 1242
Default height: 2208
IOSurface port:
width = 1242
height = 2208
bytes per row = 4992
size = 11022336
pixel format = 'BGRA'
bytes per element = 4
CPU cache mode = Default cache.
Pixel size casting = Yes
Damage rectangle:
Last damage region = {551.000000, 0.000000, 152.000000, 61.000000}
Display rotation:
Angle = 0 radians
Port:
UUID: FB02BCD9-XXXX-XXXX-XXXX-2BC67C3E53CA
Power state: On
Display class: 1
Default width: 0
Default height: 0
Damage rectangle:
Last damage region = {0.000000, 0.000000, 0.000000, 0.000000}
Display rotation:
Angle = 0 radians
poll
poll
オプションでIOポートのイベントをポーリングします。
試しにシミュレータを回転させた場合、以下の様な出力が得られました。
$ xcrun simctl poll booted
Rotation event received for IO port: SimDisplayConsoleDebugger
Rotation angle changed to: -π/2 radians
Damage event received for IO port: SimDisplayConsoleDebugger
Damage rectangle: {0.000000, 0.000000, 1242.000000, 2208.000000}
Damage event received for IO port: SimDisplayConsoleDebugger
...
他にどういったイベントがあるのかあまり把握してないので
気が向いたらまた調査してアップデートします。
screenshot
screenshot
オプションでスクリーンショットを撮る事が出来ます。
$ xcrun simctl io booted screenshot screenshot.png
recordVideo
recordVideo
オプションでスクリーンキャプチャ(動画)を撮る事ができます。
$ xcrun simctl io booted recordVideo capture.mov
以下調査中🙇🏻
pair_activate
pair_activate
コマンドはiPhoneとWatchのペアをアクティベートするはずなのですが、
pair
コマンドで紐付けた時点で状態がactive
になってたので、このコマンドを使うタイミングがわかってません 😰
launch
--stdout 及び --stderrオプション
シミュレータのログ出力などを指定したパスにリダイレクトさせる事が出来ます。
良い例が思いつかなかったので一旦保留中😰
spawn
spawn
コマンドは任意のプロセスを起動させる事が出来る様です。
Usage: simctl spawn [-w | --wait-for-debugger] [-a <arch> | --arch=<arch>] <device> <path to executable> [<argv 1> <argv 2> ... <argv n>]
If you want to set environment variables in the resulting environment, set them in the calling environment with a SIMCTL_CHILD_ prefix.
以下の様にlog
ツールを使ってシミュレータ上のログを照会する時に使ったり、
SBShortcutMenuSimulator(https://github.com/DeskConnect/SBShortcutMenuSimulator) の様なツール使用時にも使われてる様ですが、
ちょっと私の調べが足りなくてよくわかってません😰
$ xcrun simctl spawn booted log stream --level debug
参考URL