前回の続き

CLLocationManagerを使って位置情報取得を実装する場合、表示されるAlertや許可状態の判定などを理解しておくべきです。

※ 以下はiOS 6で確認しています。

位置情報サービスのオン・オフ

設定から位置情報サービスのオン・オフができることを理解します。

「OSの設定 > プライバシー > 位置情報サービス」から以下の画面が開き、ここで位置情報サービスの許可を設定できます。

端末での位置情報サービスがオンの時は、アプリ単位で位置情報サービスのオン・オフを設定できます。

06

端末での位置情報サービスがオフの時は、自動的に全アプリで位置情報サービスがオフになります。

06-1

startUpdatingLocationを呼んだ時に表示されるAlert

startUpdatingLocationを呼んだ時に条件によって以下のAlertが表示されます。

端末での位置情報サービスがオンの場合

このアプリで位置情報取得を許可するかどうかのAlertが表示されます。

日本語
10

英語
08

基本的には一度、許可する、許可しないを押すと表示されなくなります。表示されなくなったら、アプリではなく設定でオン・オフを切り替えることになります。

端末での位置情報サービスがオフの場合

設定で位置情報取得をオンにすることをうながすAlertが表示されます。

日本語
11

英語
03

このAlertも基本は一度ボタンを押すと表示されなくなります。設定ボタンを押すと設定が開きます。設定で位置情報取得をオンにしてからアプリに戻ると、今度は位置情報取得を許可するかどうかのAlertが表示されます。

これらのAlertの表示のタイミングですが、インストール直後の1回目のstartUpdatingLocationでは必ず表示されるようですが、それ以外でも表示されることがあり、そのタイミングは特定しきれませんでした。設定から位置情報サービスのオン・オフを触ると、また表示されることがあったり・・・

端末の位置情報取得許可状態を判定

locationServicesEnabledというクラスメソッドを使うと端末での位置情報取得許可がされているかを判定できます。

if (![CLLocationManager locationServicesEnabled]) {
   // TODO:Alertの表示などを行う
   return;
}

このメソッドを使って端末で位置情報取得が不可能なら一部のUIを無効にするなどの処理ができると思います。ただ次で説明するメソッドのほうがより細かく判断できて良いかもしれません。

アプリの位置情報取得許可状態を判定

authorizationStatusというクラスメソッドで位置情報取得許可の状態を細かく判定できます。

kCLAuthorizationStatusNotDetermined 端末で位置情報取得許可されているが、まだアプリで位置情報取得許可を確認していない(Alert未表示)
kCLAuthorizationStatusRestricted 機能制限がオンになっており位置情報取得が許可されない。また設定変更も不可能な状態(機能制限を解除しない限り)
kCLAuthorizationStatusDenied 端末もしくはアプリで位置情報取得が許可されていない
kCLAuthorizationStatusAuthorized アプリでの位置情報取得が許可されている

端末で位置情報取得許可がオフの時は、アプリで位置情報許可Alertで許可を取っていなくても、kCLAuthorizationStatusDeniedになることに注意してください。

以下のようにすれば、アプリが位置情報取得可能どうか判断出来ます。

if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) {
    // TODO:アプリが位置情報取得を許可されていない時の処理
}

ちなみに位置情報取得許可のAlertを表示するきっかけはstartUpdatingLocationが作りますが、Alert表示中にstartUpdatingLocationは終了することに注意してください。つまり以下の様な処理は無効です。

[_locationManager startUpdatingLocation];
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
   // Alertで位置情報取得が許可されたことを期待した処理
}

その3へ続く