simctlコマンドを使ってみる


`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`と同じものが表示されているはずです。
![Kobito.1UIXSS.png](https://qiita-image-store.s3.amazonaws.com/0/11776/4218e418-9445-ce3c-624c-c83c26a90a70.png "Kobito.1UIXSS.png")

### Devices
`Devices`は現在インストール済みのシミュレータの一覧になります。

XcodeのDevicesに表示されてるものと同じです。
![Kobito.HJH0xF.png](https://qiita-image-store.s3.amazonaws.com/0/11776/5681b6f8-b981-0bbe-3bcb-f910cf72dc87.png "Kobito.HJH0xF.png")


### Device Pairs
`Device Pairs`はiPhoneとWatchのシミュレータのペアの一覧です。

XcodeでもWatchとのペアは確認できますが、一覧性としては個別にSimulatorを選択しなければならないXcodeのDevices画面より`simctl list`の方が分かりやすそうですね。
![Kobito.ubvJf1.png](https://qiita-image-store.s3.amazonaws.com/0/11776/3504c7a7-7fbf-01d5-418e-62b6f168c07d.png "Kobito.ubvJf1.png")

### `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...'に相当します。
![Screen Shot 2017-03-11 at 14.26.08.png](https://qiita-image-store.s3.amazonaws.com/0/11776/1206bf02-8b83-3912-6861-67a48452a2b8.png "Screen Shot 2017-03-11 at 14.26.08.png")


## 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

http://qiita.com/garsue/items/aad6e11091b2331c6ce3