はじめに
AirTagが発売され数週間が経ちました。皆さんはもう購入しましたか?
私は様子見で1個だけ購入しました。 財布に入れて家の中で見つからない時などに使って探してみました。結構便利かもしれない…?似た商品のTileなどは使ったことがなかったので新鮮な気持ちで使っています。
AirTagといえば位置情報ですよね。位置情報といえばLocationManagerです。
6月に予定しているWWDCでも、出たばかりのAirTagを挙げて、位置情報関連で何か出てくるかも知れません。今のうちに去年のWWDCで発表された新しいlocation及びPrecise(精度)について理解、復習しておきませんか?
ということでどれくらいのPreciseなのかを実際に取得してみた結果付きでまとめてみます。
Precise
iOS14から追加されたCoreLocationの新しい項目がPreciseです。iOS14以降から位置情報許可ダイアログに見慣れないバナー状のものが表示されていることにお気づきでしたか?
正直ほとんどのiPhoneユーザーは気づいておらず、デベロッパーかAppleの技術に興味がある人くらいしか気づいていないと思います。
なぜなら既にインストールしているアプリについては自動的に正確な位置情報を返すようになっています。頻繁にアプリを入れていない限りは気付きません。

こちらが正確な位置情報の時のダイアログです。右上の正確な位置情報がオンになっており、ダイアログに書いてあるであろう地図はモザイク越しですが細かく表示されていることがわかると思います。

こちらは正確な位置ではない時のダイアログです。左上の正確な位置情報がオフになっており、ダイアログ内のマップも広域になっているのがわかるかと思います。また白い縁の円で囲われていますね。
以上、これら2種類の位置情報が取得できるようになっています。正確な位置情報がオフになった状態では、電力消費が少なく済むことが一つメリットとして挙げられます。またユーザーとしても全てのアプリで位置情報を常にぴったり取得されているのも気に掛かるもので、そこから抜け出しユーザーのプライバシーに配慮したという点がメリットではないでしょうか。
設定アプリ内に存在する位置情報の権限画面に「正確な位置情報」というトグルが追加されています。ここからユーザーは後からでも正確さを変更することができます。

さて、この正確ではない位置情報、どの程度の曖昧さを含んでいるかと言うと基準として5km程度だと言われています。ユーザーの実際の現在位置は半径5kmの円中のどこかにあります。
検証として自分でも位置情報を取得できるアプリを作成し、 詳細な位置情報をオンにした時とオフにした時とを比較しました。計測の際には正確な位置情報オン、オフ共に同じ場所で計測しました。
詳細な位置情報がオンかオフかによらず、位置情報は小数点14桁程度までアプリから返却されました。以下の表では一般に国内で利用されている小数点6桁に従い表記します。
まず川崎駅での計測結果は以下の表に示します。
緯度 | 経度 | 差分(km) | |
川崎駅(GoogleMap) | 35.53146 | 139.69690 | |
詳細な位置情報オン | 35.531664 | 139.696958 | – |
詳細な位置情報オフ | 35.508862 | 139.684119 | 2.792166 |
追加データとして、川崎駅周辺の駅から少し離れた地点で動かずに計測したものが以下になります。
緯度 | 経度 | 差分(km) | |
詳細な位置情報オン | 35.531368 | 139.684496 | – |
詳細な位置情報オフ | 35.515893 | 139.682168 | 1.735584 |
詳細な位置情報オンの座標とオフの座標では2.79km、1.74kmの違いが生まれていました。
公式によれば精度制限時、その場所が都市部であれば誤差範囲は5km以下になり、農村部など過疎地域では10km以上が適応されるとのことで、今回の計測地では5km以下が適用されているようです。
実装面での変更
iOS14での位置情報に関する権限を確認、取得する方法について主だって2点変更、追加があります。
位置情報へのアクセス権限の取得
open class CLLocationManager : NSObject {
@available(iOS, introduced: 4.2, deprecated: 14.0)
open class func authorizationStatus() -> CLAuthorizationStatus
@available(iOS 14.0, *)
open var authorizationStatus: CLAuthorizationStatus { get }
}
写真アプリのアルバムへのアクセス権限を確認するものとほぼ同じですね。iOS14以降では下のauthorizationStatusを利用しましょう。
正確な位置情報アクセス権限の一時的要求
open class CLLocationManager : NSObject {
@available(iOS 14.0, *)
open func requestTemporaryFullAccuracyAuthorization(withPurposeKey purposeKey: String, completion: ((Error?) -> Void)? = nil)
@available(iOS 14.0, *)
open func requestTemporaryFullAccuracyAuthorization(withPurposeKey purposeKey: String)
}
これを呼び出すと一時的に正確な位置情報を取得することを要求できます。地図系アプリでの案内機能などに際し適宜使うのが望ましいですね。
まとめ
ユーザーが位置精度を下げることが選択できるようになりました。逆にアプリ側の操作から位置精度を一時的にあげることも要求できるので、必要になった場合に精度をあげるようにするとユーザーも抵抗なく受け入れられると思います。
また、info.plistにキー(NSLocationDefaultAccuracyReduced)を設定することで、位置情報を正確に取得するかどうかの選択を権限取得時にユーザーに行わせないことも可能です。
この場合には正確な位置情報はオフなので気づかないうちに正確な位置情報を取得する、ということにはなりませんが、アプリの機能に過剰な精度の権限を取得するのはユーザー視点では気分の良いものではないでしょう。アプリの開発者もそういった部分で配慮が必要です。