【Swift】位置情報ダイアログの仕組みについて

位置情報許可ダイアログについて調べたことをまとめます。

位置情報許可ダイアログの種類

位置情報の許可を求めるダイアログとしては最初に表示するのがrequestWhenInUseAuthorization()を呼び出した場合のダイアログです。

続いてアプリの使用中は許可を選択した後にrequestAlwaysAuthorization()を呼び出すことで常に許可を求めるダイアログを表示させることが可能です。

常に許可を求めるダイアログは「アプリの使用中は許可」になっていないと呼び出しても表示されないです。

そのほか、アプリがバックグラウンドになった場合に過去〇日間位置情報をバックグラウンドを利用しましたというダイアログが出て、バックグラウンドでの位置情報許可を継続するか確認されるダイアログもありました。

設定アプリから権限を変更する

設定アプリから権限を変更してrequestWhenInUseAuthorization()とrequestAlwaysAuthorization()を呼び出すとどうなるのか確認しました。

※初回の位置情報許可ダイアログで選択を行うまでは設定アプリには何も表示されないです

「許可しない」に変更した場合

requestWhenInUseAuthorization()とrequestAlwaysAuthorization()を呼び出してもダイアログは表示されません

「次回または共有時に確認」に変更した場合

requestWhenInUseAuthorization()を呼び出すと位置情報を求める許可ダイアログが表示されます。続けてrequestAlwaysAuthorization()を呼び出すと常に許可を求めるダイアログも表示されましたので完全にリセットしてくれているようです。

また別のパターンとして最初にrequestAlwaysAuthorization()を呼び出すと通常の位置情報許可を求めるダイアログが表示されました。常に許可を求めるために「アプリの使用中は許可」にして、続けてrequestAlwaysAuthorization()を呼び出してもダイアログは何も表示されませんでした(1回目のステータスが既に.authorizedAlwaysとなるため2回目は無視される)

どうやらこのパターンでは常に許可を求めるダイアログが出るタイミングはバックグラウンド利用時になるみたいです。

「このAppの使用中」に変更した場合

ステータスがauthorizedWhenInUseになっているのにrequestAlwaysAuthorization()を呼び出しても常に許可を求めるダイアログは表示されませんでした。OSが不要と判断して表示されない仕様になっているみたいです。

「常に」に変更した場合

requestWhenInUseAuthorization()とrequestAlwaysAuthorization()を呼び出してもダイアログは何も表示されないです。

さいごに

位置情報許可ダイアログの挙動を色々と確認することができてスッキリしました。許可ダイアログと端末設定側の文言を揃えてくれると助かる…

書き忘れていましたが、自分で出したOSダイアログよりも許可権限を求めるダイアログの方が優先度が高く最前面に表示されるようになっていました。