xcrun simctl locationは、iOSシミュレータの位置情報をシミュレートするサブコマンドである。 startオプションを使うと、緯度・経度のウェイポイント(経由地点)を複数指定し、地点間を補間しながら移動する様子をシミュレータに再生させられる。 xcrun simctl location runでiOSシミュレータにプリセットの移動シナリオを再生するrunが用意されたシナリオを再生するのに対し、startは任意の座標を経路として自由に指定できる。 単発の座標を切り替えるだけでよい場合は、xcrun simctl location setでiOSシミュレータの位置情報を固定値に設定するsetの方がシンプルである。

基本的な使い方

ウェイポイントをスペース区切りで2つ以上指定する。

$ xcrun simctl location booted start 35.681236,139.767125 34.702485,135.495951
Parsed 2 waypoints

setrunと異なり、startParsed N waypointsという結果を標準出力に表示する。 コマンド自体はすぐに終了し、その後もバックグラウンドで移動の再生を継続する。

log streamlocationdのログを見ると、deltaDistance(前回位置からの移動距離)が約1秒間隔で20前後ずつ増加していく。 速度を指定しなかった場合のデフォルトである20m/sと一致する値である。

$ xcrun simctl spawn booted log stream --level debug \
    --predicate 'eventMessage contains "deltaDistance"'

速度を指定する

--speedオプションで、ウェイポイント間を移動する速度をm/s単位で指定できる。

$ xcrun simctl location booted start --speed=100 35.681236,139.767125 34.702485,135.495951

実際に試したところ、--speed=100を指定するとdeltaDistanceは約1秒間隔で100前後ずつ増加しており、指定した速度通りに移動していることを確認できた。

更新間隔を指定する

位置情報の更新頻度は、--interval(時間の間隔)または--distance(移動距離の間隔)のいずれかで制御できる。 両方省略した場合は1.0秒間隔で更新される(基本的な使い方の例で確認した挙動)。

--distanceを指定すると、指定した距離を移動するたびに更新が発生する。 ヘルプに記載されているサンフランシスコ・ニューヨーク間の例で実際に確認する。

$ xcrun simctl location booted start --distance=1000 --speed=260 \
    37.629538,-122.395733 40.628083,-73.768254

log streamで確認すると、deltaDistanceはおよそ1000ごとに区切られて増加しており、時間ではなく移動距離を基準に更新が発生していることが分かる。 --speed=260(260m/s)で1000m移動するのに必要な時間は約3.8秒だが、実際のログの間隔もおよそ3.8〜3.9秒ごとになっていて、速度と距離の指定が矛盾なく組み合わさっていた。

3つ以上のウェイポイントを指定する

ウェイポイントは3つ以上指定できる。 ヘルプの記述通りであれば、地点間を順に補間しながら移動するため指定した順番で各地点を経由するはずだが、今回は経由順序そのものの詳細な確認までは行っていない。

$ xcrun simctl location booted start --speed=50 \
    35.681236,139.767125 34.702485,135.495951 33.590355,130.401716
Parsed 3 waypoints

標準入力からウェイポイントを読み込む

ウェイポイントの代わりに-を指定すると、標準入力から1行1ウェイポイントの形式で読み込める。

$ printf "35.681236,139.767125\n34.702485,135.495951\n" | xcrun simctl location booted start -
Parsed 2 waypoints

ウェイポイントが1つだけだとエラーになる

ヘルプに明記されているとおり、ウェイポイントは最低2つ必要である。 1つだけ指定すると、終了コード22でエラーになる。

$ xcrun simctl location booted start 35.681236,139.767125
Must specify at least two waypoints
Parsed 1 waypoints
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=22):
Simulator device failed to complete the requested operation.
Invalid argument
Underlying error (domain=NSPOSIXErrorDomain, code=22):
	Invalid waypoints
	Invalid argument

再生を止める

再生中の移動を止めたい場合はxcrun simctl location list/clearでiOSシミュレータの位置情報シナリオを一覧・クリアするclearを使う。

$ xcrun simctl location booted clear

活用例: 経路を伴う機能のテスト

runのプリセットシナリオでは表現できない、任意の出発地・経由地・目的地を組み合わせた経路を自由に作れる。 配達アプリの経路表示や、ナビゲーションアプリの現在地追従など、決まった座標の並びに沿って位置情報が更新される機能のテストに向いている。