Core Locationフレームワークを使用してデバイスを特定し、locationManager:didUpdateToLocation:fromLocation:メソッドが場所で呼び出されると、ユーザーの追跡を停止します。
ただし、初めてアプリを起動したとき(新規インストールから)。Location ManagerのstartUpdatingLocationにメッセージを送信すると、ユーザーは位置情報サービスを受け入れるか拒否するかを示すアラートを受け取ります。
追跡が開始されないことを受け入れると、通知が着信し始めるのは、startUpdatingLocationが再度呼び出されたときに、離れてこのViewControllerに戻ったときだけです。
私はlocationManager:didChangeAuthorizationStatusを実装しています:ユーザーが位置情報サービスを受け入れる(または拒否する)とメッセージが表示されると考えていますが、そうではありません。
位置情報サービスのメッセージが却下されたらすぐに、位置情報を更新するための正しい方向を誰かに教えてもらえますか?
ありがとう。
コードサンプルで更新
ロジックをカプセル化するシングルトンクラスがあります。ユーザーの場所が要求されたときに、CLLocationのタイムスタンプのチェックが実行され、古すぎる場合は追跡開始のメッセージが表示されます。これにより、CLLocationManageriVarが遅延ロードされます。
-(void)startTracking{
if(!self.locationManager)
_locationManager = [[CLLocationManager alloc] init];
if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
[self invalidateUserLocation];
}else{
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
}
}
受け取った新しい場所:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
_userLocation = [newLocation retain];
NSDictionary * info = [NSDictionary dictionaryWithObject:self.userLocation
forKey:@"userLocation"];
[[NSNotificationCenter defaultCenter] postNotificationName:kUserLocationFound
object:self
userInfo:info];
[self stopTracking];
}
追跡を停止します。
-(void)stopTracking{
if(!self.locationManager)
return;
[self.locationManager stopUpdatingLocation];
self.locationManager.delegate = nil;
}
ユーザーの場所を必要とするViewControllerがある場合、そのようにシングルトンオブジェクトでuserLocationを呼び出します。最近の場合はCLLocationを返し、そうでない場合はnilを返してやり直します。最初の更新を受け取ったときに追跡を停止することに注意してください。しかし、これが初めて実行されてアラートビューが表示されたときは、何も追跡されていません。
- (CLLocation*)userLocation
{
if(_userLocation.coordinate.latitude == 0 && _userLocation.coordinate.longitude == 0){
[self startTracking];
return nil;
}else{
NSDate* timeNow = [NSDate date];
NSTimeInterval interval = [timeNow timeIntervalSinceDate:_userLocation.timestamp];
if(interval >10)
[self startTracking];
return _userLocation;
}
}