※本記事は、一般に公開されている情報を元に作成しています。記事中の画像はWWDCのスライドのものを引用しております
位置情報を扱うiOSアプリを開発する際に必要となる Core Location ですが、iOS 11 でもいくつか変更点があるようです。気になったものを以下にまとめます。
CLGeocoder improvements
GLGeocoder が Contacts framework をサポートしました。
例えば GLPlacemark から CNPostalAddress を取得することも可能になりました。
Authorization and usage reporting
権限周りも大きな変更がありました。位置情報を利用する際、今までは
- NSLocationWhenInUseUsageDescription(使用中のみ許可)
- NSLocationAlwaysUsageDescription(常に許可)
のどちらかをサポートすればよかったのですが、iOS 11 からは NSLocationWhenInUseUsageDescription(使用中のみ許可) のサポートが必須になりました。
つまりこれは、"常に位置情報の使用を許可しないといけないアプリ"が、今後なくなることを意味します。
また、この変更はすでに公開済みの古いアプリにも適用されます。
上記エントリのように、今まで「常に許可」しか選択できなかったアプリが、突然 iOS 11 から「使用中のみ許可」も選択できるようになるのはこのためです。
この変更に伴い、「常に許可」と「使用中のみ許可」を両方含んだ新しいプライバシー項目(NSLocationAlwaysAndWhenInUseUsageDescription)が追加になっています。
初回起動時など、ユーザが何も許可していない状態で requestAlwaysAuthorization
を実行すると、この NSLocationAlwaysAndWhenInUseUsageDescription
がダイアログに表示されます。ユーザは「常に許可」か「使用中のみ許可」を選択できます。
Supporting Always Authorization
今後も「常に許可」をサポートしつつ、かつ古いiOSバージョンもサポートしたい場合は、すべてのプライバシー項目を設定し、ユーザにそれぞれの権限が選択可能である旨を説明するのがベストプラクティスのようです。
Requesting Authorization
「常に許可」はあくまで「使用中のみ許可」の追加要素であり、まずはユーザに「使用中のみ許可」を求め、その後必要になったときに「常に許可」へ遷移するフローをAppleは推奨しているようです。
次の図では、ユーザーによる許可ステータスの遷移がわかりやすくまとまっています。
今後もしかすると NSLocationAlwaysUsageDescription
が無くなるかもしれませんね。
Location Usage Indicators
iOS 10 までは「使用中のみ許可」したアプリが、バックグラウンド動作中に位置情報を使用した場合「○○が位置情報を利用中」という青いバーが表示されたと思います。(例:Google Maps アプリでナビモード実行中にホームボタンを押してバックグラウンド状態にした場合)
iOS 11 からは「常に許可」のアプリがバックグラウンド中に位置情報を使用した場合も 常にこの青いバーが表示 されるようになります。(iOS 11リリース直後はこの仕様を知らないユーザーさんが混乱しそうですね)
画面右上の矢印のポリシーにも変更があります。
Hollow arrow: 位置情報要求中
Solid arrow: 位置情報受信中
まとめ
「使用中のみ許可」しかサポートしていないアプリはあまり影響がなさそうですが、「常に許可」をサポートしている場合は、そのアプリが位置情報を常に使わなければならない理由を説明するなど、何かしらの対応が必要そうですね。