iOS 14 でさらに強化された位置情報まわりのプライバシー

_※本記事は、[一般に公開されている情報](https://developer.apple.com/videos/play/wwdc2020/10660/)を元に作成しています。記事中の画像はWWDCのスライドのものを引用させて頂いております_

WWDC 2020 開幕しましたね！位置情報まわりも色々変更があったのでまとめてみます。


## 正確な位置情報を使用するかどうかユーザーが選択できるようになった

iOS 14 では位置情報の使用許可を求められる際「Precise On（正確な位置情報）」オプションが表示されます。Precise は「正確な」という意味です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/f1447613-29cc-22b2-1435-6c7b58bb8aa8.png)

このオプションをオフにすると、例えば地図を利用する場合はおなじみの青いドットは表示されず、このような大きめの円が現在地として表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/9a0c6bd2-d073-70c2-11cb-1016c4b84914.png)

ユーザーは設定画面からこの設定を変更することができます。

![スクリーンショット 2020-06-24 6.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/f77c1c5e-93fe-09f7-60b3-e1dc7642342a.png)


実際にユーザーが居る位置とは数キロメートルずれることが予想されるので、正確な位置情報を前提としたアプリは注意が必要ですね。

ユーザーの許可ステータスは `accuracyAuthorization` で取得できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/33599aa7-4047-d930-2600-611232854b48.png)

この許可ステータスは iOS、Apple Watch と同期されます。

## 正確な位置情報を必要としないアプリの場合

正確な位置情報を必要としないことがわかっている場合は Info.plist の `NSLocationDefaultAccuracyReduced` を true にしておくと、デフォルトでこのオプションが非表示になります。

<img width="772" alt="スクリーンショット 2020-06-24 8.00.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/79c4e738-f17e-6ed9-db5f-fc4bce012b6c.png">

このとき `accuracyAuthorization` は `.reducedAccuracy` になります。


## iOS 14時代の位置情報許可ステータスチェック

前述のように、iOS 14以降は「位置情報の使用を許可しているか」に加え「正確な位置情報の使用を許可しているか」が追加されたので、次のようにステータスをチェックすると良いでしょう。（WWDCのスライドから引用）

```swift
switch manager.authorizationStatus() {
case .authorizedAlways, .authorizedWhenInUse:
    // 位置情報の使用を許可している
case .notDetermined, .denied, .restricted:
    // 位置情報の使用を許可していない
default:
    // Unhandled case
}
switch manager.accuracyAuthorization {
case .fullAccuracy:
    // 正確な位置情報の使用を許可している
case .reducedAccuracy:
    // 正確な位置情報の使用を許可していない
default:
    // Unhandled case
}
```

## 一時的にPrecise設定をオンにもできる

例えばナビ機能を使うときだけ正確な位置情報の取得を許可する、みたいな使い方もできます。

```swift
if locationManager.accuracyAuthorization == .reducedAccuracy {
    locationManager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "WantsToNavigate") { _ in 
        if self.locationManager.accuracyAuthorization == .fullAccuracy {
            print("begin navigate")
        }
    }
} else {
    print("begin navigate")
}
```

Info.plist の `NSLocationTemporaryUsageDescriptionDictionary` には「一時的に正確な位置情報を使う理由」を複数セットできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/c62ca7cb-dd2e-dfca-73df-63b71560312c.png)

通常は正確な位置情報を必要としないアプリの場合、とても有効ですね。

## App Clips の位置情報について

App Clips から位置情報を使用する場合は選択肢が

- 1度だけ許可
- 明日まで許可

になるので注意してください。

<img width="809" alt="スクリーンショット 2020-06-24 8.13.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/75263f0e-69aa-964d-b7ee-fd53b5134368.png">

つまり、App Clips は「常に位置情報を許可する」が選択できません。

※これを、12時を過ぎれば馬車もドレスも魔法が解けて元に戻ってしまうシンデレラに例えて説明してるのが面白かったです。

## WidgetKit での位置情報について

Widgets で位置情報を使用するには Info.plist に `NSWidgetWantsLocation` をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/0586e7bc-dd01-50ab-87e1-604ed03f9c59.png)

Widgets からは位置情報の許可を求めるダイアログは表示できないので、親アプリで位置情報の使用を許可してもらう必要があります。このあたり、どんなフローでユーザーに許可してもらうか？が重要になってきそうですね。

## まとめ

今年の What's new in location をひとことでまとめるなら <b> 「必要なときに、必要な権限を」</b> といったところでしょうか。
Appleが、よりプライバシーに配慮している印象を受けました。

## リンク

- [What's new in location \- WWDC 2020 \- Videos \- Apple Developer](https://developer.apple.com/videos/play/wwdc2020/10660/)
- [【iOS 11対応】知っておきたい位置情報周りの変更点 \- Qiita](https://qiita.com/koogawa/items/83883a0282207be7751c)