概要
今年はプライバシー、権限周りで多くのアップデートがあったのでまとめてみます。
この記事は以下のWWDC 2020セッション動画、及び公式ドキュメントを元に書いています(ここで出てくるスクショも動画のものです)。
周辺知識も含めて深く知りたい方はご参考までに。
- Build trust through better privacy
- Meet Nearby Interaction
- Design for location privacy
- What's new in location
- Handle the Limited Photos Library in your app
- AutoFill everywhere
なお、IDFAに関してはすでに多くの記事が出ているので省きます。
所感
今までよりいっそう、「必要な分だけの権限をもらう」感が強くなった
背景
- アプリがアクセスできる情報量とユーザ体験のバランスを取りやすくしたい
- iOS 13までは許諾アラートが出てきたらYesと答えないとアプリのコア機能を使えないこともあった
写真
写真共有アプリの例
iOS 13の場合、写真ライブラリ全体へのアクセス権限を求めることになる。
iOS 14からはLimited Photos Libraryが使えるようになり、ユーザが選択した写真しかアプリからアクセスできない状態を作ることができる。ちなみにフォーラムの回答によると、「選択した写真のみ」の選択肢はオプトアウトできないとのこと。さらに、今回の変更は、新しいAPIや機能を採用していないアプリでも、iOS 14端末だったら影響を受けてしまう。
「Select Photos」を選択するとこのようなピッカー(PHPickerViewController
)が表示される。このときピッカーは別プロセスで起動されており、選択し終わった写真しか知ることができない。
PHPicker
PHPicker
はUIImagePickerController
に置き換わる新しいフレームワーク。PHPickerには検索機能、複数選択機能などを備わっている。加えて、写真ライブラリへのアクセス権を必要としないので、許諾アラートを表示する必要もない。アプリがすべての写真にアクセスする必要がない限りPHPickerを使うことが推奨されている。
アクセスレベル
ステータスは既存のものに加え、.limited
ステータスが増えている。→PHAuthorizationStatus
これとは別にiOS 14からはPHAccessLevelというアクセスレベルを指定するenumが登場した。.addOnly
を指定した場合は左、.readWrite
を指定した場合は右の許諾アラートになる。
今までのステータス確認APIには更新が入り、アクセスレベルの指定が必要になっている。ユーザが.limited
になっているかどうかは以下のように確認する。
許諾リクエスト処理は、ステータス問い合わせと同じようにアクセスレベルを指定する。これにより許諾アラートが表示されるようになる。
従来のAPIは将来的に非推奨なAPIになる。従来のAPIのままだと、ユーザが「選択した写真のみ」で許可した場合、.limited
ではなく.authorized
を返してしまう。
基本的には.authorized
と.limited
では同じように動くべきだが、.limited
ではユーザのアルバムを作成、取得できなかったり、クラウド上のコンテンツやアルバムにアクセスできなかったりするので注意が必要。
許諾範囲の変更
設定アプリから変更することができる。
新しいAPIに何も対応を入れていないアプリで、ユーザが「選択した写真のみ…」にした場合は、アプリのライフサイクルごとに一度、PhotoKitのコンテンツにアクセスする時に、現在の選択範囲を維持するか、変更するかを問うアラートが出てくる。
選択UIを手動で表示させて許諾範囲を変更する方法もある。
※ある記事によると、フォトライブラリへのフルアクセスを必要とするアプリは、ステータスが.limited
の場合、この選択UIを表示させるためのボタンを表示しないといけないといけないと書いているが、それに該当しそうな公式文章は見つけられなかった。
許諾アラートを毎回表示させないためには
PHPhotoLibraryPreventAutomaticLimitedAccessAlert
をinfo.plist
に書いておけば、アクセスの拡張を促すアラートが自動で出てくることはなくなる。
位置情報
近くにいる人に写真を送るアプリの例
写真を共有したい友達を見つけるために位置情報を使用するアプリを考える。iOS 13では以下の許諾アラートだった。
iOS 14ではおおよその位置情報だけをアプリと共有できる機能が追加される。Precise設定をOFFにすると、おおよその位置情報の更新のみアプリに通知される。
ユーザは設定アプリから設定を変更することもできる。
Apple Mapsの例
Apple Mapsでは「おおよその位置情報の共有」を選択した人には、アプリ起動時にマップ上部に目立つボタンを表示している。このボタンをタップすると許諾アラートが表示される。
ユーザがアプリ内を回遊し始めるとこのボタンは目立たなくなる。
App clips
App clipのユースケースに特化して新しい位置情報アクセスが設計された。App clipsでは正確な位置情報へのアクセスを行わなくても、例えば間違った店舗のウェイティングリストに入ってないかなどの確認はできる。App clipsが特定の場所で起動されたかどうかをシステムに尋ねる程度なら、許諾アラートを出す必要はない。
許諾状況の確認
「いつ」「どの程度」という2軸で許諾状況を確認することができる。
一時的に正確な位置情報をリクエストする
もし正確な位置情報を必要とする機能があるアプリで、ユーザがおおよその位置情報しか共有していない場合は、ユーザに一時的に許諾のアップデートを依頼することができる。
実装としては以下の通り。
一時的に正確な位置情報を求める理由はinfo.plist
のNSLocationTemporaryUsageDescriptionDictionary
に書いておく。
連絡先
写真共有アプリの例
手動で共有したい友達を選ぶために連絡先情報を使用するアプリを考える。iOS 13までは以下の許諾アラートが出るケースもあった。
とはいえCNContactPickerViewController
を使っていれば特に許諾を取ることなく連絡先データへのアクセスが可能だった。
iOS 14からは、TextFieldに特定のtextContentType
を指定していた場合、QuickTypeバーに連絡先データベースから取ってきた情報がサジェストされるようになる。
NearbyInteraction
NearbyInteractionフレームワークを使うときはBluetoothやネットワークアクセスの使用許可をとる必要はない。その代わり、アプリは1回限りのセッションベースのアクセスを要求する。あるユーザのデバイスと、その近くにいる別のデバイスの両方が許可をしたら、デバイス間がどれくらい離れているのか、どの方向にいるのかなどを知ることができる。この許可は、アプリがフォアグラウンドで使用され続けている限り有効になっている。