iOSデバイスでアプリから位置情報取得する許認可状態には、「常に許可」「アプリ使用中のみ許可」「許可しない」のステータスがある。
アプリからは、「常に許可」「アプリ使用中のみ許可」のいずれかの応答をユーザにダイアログ画面を表示することにより促し、応答内容に応じてOSがプライバシー情報として設定する。
「常に許可」というのは、バックグラウンド実行中でもCLLocationManagerを起動して位置情報を取得する状態を指す。
1. info.plist の編集
下記の2つのキーを追加する。設定したプロパティ値はユーザーに許可を促すダイアログ画面に表示される。ダイアログ画面には定型文が表示されるが、補足的な説明のための語句をこのプロパティ値に入力しておくと、定型文の下に表示される。
NSLocationWhenInUseUsageDescription (アプリ使用中のみ許可)
NSLocationAlwaysUsageDescription (常に許可)
2. コードの修正
処理の順序としては、(1) ユーザに位置情報の取得について「常に許可」「アプリ使用中のみ許可」のいずれかの応答を促し、(2) OKの許可が応答されれば、位置情報の取得をスタートさせる。
iOS7以前もサポートするアプリの場合、上記(1)を実行しようとすると実行クラスが存在しないため、アプリがクラッシュするので、respondsToSelector で事前にチェックして処理を振り分ける必要がある。
hoge.h
@property (nonatomic, retain) CLLocationManager *locationManager;
hoge.m
(1) ユーザに位置情報の取得について「常に許可」「アプリ使用中のみ許可」のいずれかの応答を促す。
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { // iOS8以降
// 位置情報測位の許可を求めるメッセージを表示する
// [_locationManager requestAlwaysAuthorization]; // 常に許可
[_locationManager requestWhenInUseAuthorization]; // 使用中のみ許可
} else { // iOS7以前
// 位置測位スタート
[_locationManager startUpdatingLocation];
}
(2) 位置情報測位許可の応答がなされると呼ばれるメソッド。許可がとれたら位置測位をスタートする。
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse) {
// 位置測位スタート
[_locationManager startUpdatingLocation];
}
}
(3) 位置測位が行われるたびに呼ばれるメソッド。
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *newLocation = [locations lastObject];
NSLog(@"%f %f",
newLocation.coordinate.latitude,
newLocation.coordinate.longitude);
// 位置測位を終了する
[_locationManager stopUpdatingLocation];
}
参考記事:
http://qiita.com/koogawa/items/6ec24ca3201977e9642b
http://iti.hatenablog.jp/entry/2014/09/19/113940
【CLLocation 現在位置情報の最新記事】

