🛰️

Appleの「さがす」アプリはどのようにユーザーの位置を追跡しているのか?

2023/10/03に公開

TL;DR

AirTagを用いてAppleの「さがす」アプリを調査した結果、アプリが主にジオフェンシングと呼ばれる地図上の円からの出入りを監視する手法を用いてユーザーの位置情報を低い消費電力でトラッキングしていることがわかりました。

具体的には以下のように、位置情報を取得した際に地図上にジオフェンスを貼り、その領域を出た際にその位置を中心に新たなジオフェンスを貼り...ということを繰り返すことで細かい移動の追跡に電力を費やさずに大まかな軌跡を把握し、紛失中のiPhoneとのすれ違い時やAirTagから離れた際にのみBluetoothでアプリを起動し位置情報を取得することで低消費電力とサービスを両立させているようです。

コード

上記の「さがす」アプリの位置情報追跡の部分を模したアプリを以下に公開しましたのでご興味がありましたらどうぞ😊

https://github.com/iototaku/geofence-hopper

背景

紛失したiPhoneやAirTagの探索に用いられているAppleの「さがす」アプリは24時間ユーザーの位置をバックグラウンドで追跡し、ユーザーがアプリを終了したり電源のon/offを行ったりした後も機能し続けるにも関わらずその消費電力は非常に低いです。

通常GPSを使った位置トラッキングは電力を多く消費しますが「さがす」アプリのそれはわずか1%程度に抑えられています。
この低消費電力がどのような方法で実現されているかを明らかにするのが今回の目的です。

前提:iOSの位置情報の取得方法

バックグラウンド状態のiOSのアプリがユーザーの位置情報を取得する方法にはいくつかの種類があり、それぞれには以下のような特性があります。

手法名 方法 更新頻度 主な情報源 アプリ終了後の呼び出し
位置情報更新(updatingLocation) ユーザーが指定された距離を移動した際に位置情報を取得する 0m~ GPS 不可能
顕著な位置情報変化の監視(significantLocationChanges) ユーザーが携帯基地局のセルを移動した際などに位置情報を取得する 500m~ 携帯基地局(Cellular) 可能
ジオフェンシング 地図上のある点を中心とした指定半径内のエリアを監視し、エリアからの出入りがあった際にイベントを受け取る 150m~ Wi-Fi 可能

顕著な位置情報の変化の監視とジオフェンシングはユーザーがアプリをリセットしたりiPhoneの電源をON/OFFした後も機能し、位置の変化があった際に一時的にアプリを起動し30秒程度の処理を行える点が重要です。
これらは一般的には補助GPSやA-GPSと呼ばれており、端末が接続されているLTEの基地局やWi-Fiネットワークを情報源にすることでGPSを用いず消費電力を抑えることができます。

実験

方法

「さがす」アプリのトラッキングの頻度を手軽に試すために、テスト用の端末(iPhone11ProMax iOS17.0.2)で設定画面でWi-FiのON/OFFを切り替えた際に「さがす」アプリがAirTagの紛失通知を鳴らす距離がどの程度変化するかを計測しました。
実験にあたって、事前に「さがす」アプリ以外の位置情報許可を全てOFFにし、あらかじめ登録されている自宅などの場所も全て削除します。

また、アプリのリセットや電源on/offによる変化の検証と、iPhoneが静止している状態での挙動を確かめるための電波の遮断と持ち去りとビルの1階から5階への移動のケースの検証も行いました。

結果

Wi-FiをOFFにした際に紛失通知が鳴る距離が大幅に伸び、最後にAirTagがあった地点からユーザーが離れたかを判断するための情報源がWi-Fi(150m~)から基地局(500m~)に切り替わっていることがわかりました。

テストケース 移動方法 距離
Wi-FiをONにしたまま離れる 歩行 280m
Wi-FiをONにしたまま離れる 歩行 250m
Wi-FiをONにしたまま離れる 自転車 550m
Wi-FiをONにしたまま離れる 自転車 350m
Wi-FiをONにしたまま「さがす」アプリをリセットしたのちに離れる 自転車 620m
Wi-FiをONにしたままiPhoneの電源をon/offしたのちに離れる 自転車 560m
Wi-FiをOFFにして離れる 自転車 1800m
Wi-FiをOFFにして離れる 自転車 850m
Wi-FiをOFFにして離れる 自転車 1600m
Wi-FiをOFFにして離れる 自転車 1300m
電波を遮蔽して10分間待機 - 鳴らない
iPhoneを置きAirTagを持って10分間離れる 歩行 鳴らない
ビルの1階にAirTagを置いて5階で10分間待機 - 鳴らない

また、iPhoneの地図上での位置が大きく変わらない紛失のケース(電波の遮断、持ち去り、垂直方向の移動)で通知が行われなかったことから、「さがす」アプリは紛失を監視するために常にバックグラウンドで電波やユーザーの3次元空間上の移動を監視しているわけではなく地図上での有意な距離の移動があった場合にのみ処理を行っていることも示唆されています。

まとめ

  1. WiFiをOFFにすると大幅に精度が低下する
  2. アプリをリセットした後もトラッキングが継続される
  3. 地図上の有意な距離の移動がない場合は停止したままである

という三つの実験結果から、Appleの「さがす」アプリはジオフェンシングを用いて主にWi-Fiや携帯基地局を情報源に位置情報を監視していることがわかりました。
また、大まかな動作のイメージは概略に記した通りですが、アプリの状態も含めたより具体的な挙動は以下のようになっていると考えられます。

  1. ユーザーの位置情報を取得する。

  2. 現在位置を中心としたジオフェンスを設定する。

  3. ユーザーがアプリの利用を終了し、アプリがnotrunning状態になる(以後ユーザーが範囲を出るまでアプリは電池を消費しない)

  4. ユーザーがジオフェンスの範囲を出た際にアプリが30秒程度アクティブになる。

  5. ユーザーの位置情報を取得し、既存のジオフェンスを廃棄して新たにジオフェンスを設定する。

なお、ジオフェンスの範囲を出ること以外にも定期的なバックグラウンドタスクの実行やサイレントプッシュなどのトリガーも追加して位置情報の更新を行うことで、ユーザーが静止している際の監視の頻度を上げることも可能です。

追記:「さがす」アプリの位置情報の権限について

一般的なアプリでユーザーの位置情報の追跡をバックグラウンドで行う際には位置情報利用許可の「常に」をユーザーから得る必要がありますが「さがす」アプリのそれは別個に管理されており、設定画面で位置情報許可を「しない」にしたりiPhoneをさがすをOFFにした場合も紛失通知が届きます。

実験した限りアプリ外で「さがす」アプリの紛失通知を止めるために有効だったのはWi-Fiとモバイルネットワークと位置情報サービスの全てをOFFにすることで、どうやら「さがす」アプリはアプリ内の「手元から離れたときに通知」をOFFにしない限り端末が検知しているあらゆる位置情報の情報源からトラッキングを行う仕様になっているようです。

Discussion