(またはその非推奨のlocationManager:didUpdateLocations:
同等のlocationManager:didUpdateToLocation:fromLocation:
)メッセージがに送信されるCLLocationManagerDelegate
と、CLLocationManagerDelegateプロトコルリファレンスは次のように述べます。
このメッセージがデリゲートに配信されるまでに、新しいロケーションデータはCLLocationManagerオブジェクトから直接利用することもできます。newLocationパラメータには、位置情報サービスの以前の使用からキャッシュされたデータが含まれる場合があります。ロケーションオブジェクトのtimestampプロパティを使用して、ロケーションデータの最新度を判断できます。
ただし、実際には、CLLocationManager
のlocation
プロパティは更新されません。なぜだめですか?
これを実証するためのサンプルプロジェクトを作成しました: https ://github.com/sibljon/CoreLocationDidUpdateToLocationBug
関連するコードはにJSViewController
あり、そのスニペットは以下のとおりです。
- (void)viewDidLoad
{
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10000.0; // 10 km
self.locationManager.delegate = self;
self.locationManager.purpose = @"To show you nearby hotels.";
[self.locationManager startUpdatingLocation];
[self.locationManager startUpdatingLocation];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillEnterForeground:)
name:UIApplicationWillEnterForegroundNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(@"New location: %@", newLocation);
NSLog(@"Old location: %@", oldLocation);
NSLog(@"- [CLLocationManager location]: %@", manager.location);
}
//- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
//{
// for (CLLocation *location in locations)
// {
// NSLog(@"Current location: %@", locations);
// }
// NSLog(@"- [CLLocationManager location]: %@", manager.location);
//}
#pragma mark - Notifications
- (void)appWillEnterForeground:(NSNotification *)notification
{
[self.locationManager startUpdatingLocation];
}
- (void)appDidEnterBackground:(NSNotification *)notification
{
[self.locationManager stopUpdatingLocation];
}