xcrun simctl locationは、iOSシミュレータの位置情報をシミュレートするサブコマンドである。 runオプションを使うと、あらかじめ用意されたプリセットのシナリオを指定するだけで、時間経過に伴う位置の移動をシミュレータに再生させられる。

利用可能なシナリオを確認する

listオプションで、実行できるシナリオの一覧を取得できる。

$ xcrun simctl location booted list
Name                 Description
========================================================
City Run             City Run
City Bicycle Ride    City Bicycle Ride
Freeway Drive        Freeway Drive
Apple                Apple

Xcode 26.6で確認したところ、上記4つのシナリオが用意されていた。

シナリオを実行する

シナリオ名を指定してrunを実行する。

$ xcrun simctl location booted run "City Run"

コマンドはすぐに終了し、標準出力には何も表示されない。 xcrun simctl location setでiOSシミュレータの位置情報を固定値に設定するsetと違い、runはコマンドの終了後もバックグラウンドでシナリオの再生を継続する。

再生中の動きをログで確認する

set記事と同様、log streamlocationdのログを見ると、位置情報が時間経過とともに更新され続けている様子を確認できる。

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

runを実行すると、1秒前後の間隔でdeltaDistance(前回位置からの移動距離)を含むログが流れ続け、シナリオに沿って位置が連続的に更新されていることが分かる。

シナリオを切り替える・止める

再生中に別のシナリオでrunを実行すると、clearを挟まずそのまま新しいシナリオへ切り替わる。エラーにはならない。

$ xcrun simctl location booted run "City Run"
$ xcrun simctl location booted run "Freeway Drive"

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

$ xcrun simctl location booted clear

存在しないシナリオ名を指定した場合はエラーになる。

$ xcrun simctl location booted run "Nonexistent Scenario"
Could not find scenario 'Nonexistent Scenario'

シナリオごとの違い

City RunCity Bicycle RideFreeway Driveは名前の通り移動を伴うシナリオで、ログ上もdeltaDistanceが継続的に増加し続ける。 一方Appleは他の3つと異なり、実際に20秒ほど観測したところほとんどの区間でdeltaDistanceが0付近で推移しており、移動よりも特定の地点にとどまり続ける動きに近かった。 シナリオが想定する用途(移動中のテストか、特定地点にとどまっている状態のテストか)は異なる可能性があるため、動きの傾向を確認してから選ぶとよい。

活用例: 移動を伴う機能のテスト

ランニングやサイクリングの記録アプリのように、移動距離や経路を扱う機能をテストする際、実際に移動しなくてもrunでシナリオを再生するだけで位置情報の変化を発生させられる。 xcrun simctl location setでiOSシミュレータの位置情報を固定値に設定するsetのように単発の座標を指定するだけでは再現できない、継続的な移動を伴うテストに向いている。 用意されたシナリオにない任意の経路を再生したい場合は、xcrun simctl location startでiOSシミュレータに複数地点を経由する移動をシミュレートするstartを使うとよい。