5

(またはその非推奨のlocationManager:didUpdateLocations:同等のlocationManager:didUpdateToLocation:fromLocation:)メッセージがに送信されるCLLocationManagerDelegateと、CLLocationManagerDelegateプロトコルリファレンスは次のように述べます。

このメッセージがデリゲートに配信されるまでに、新しいロケーションデータはCLLocationManagerオブジェクトから直接利用することもできます。newLocationパラメータには、位置情報サービスの以前の使用からキャッシュされたデータが含まれる場合があります。ロケーションオブジェクトのtimestampプロパティを使用して、ロケーションデータの最新度を判断できます。

ただし、実際には、CLLocationManagerlocationプロパティは更新されません。なぜだめですか?

これを実証するためのサンプルプロジェクトを作成しました: 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];
}
4

2 に答える 2

1

これはバグだと思います。Appleにバグレポートを提出しました。バグレポートのミラーは、OpenRadarにあります。

http://openradar.appspot.com/radar?id=2682402

于 2013-02-07T19:40:55.043 に答える
0

ドキュメントを読んだように、locationManagerDelegateはキャッシュされたデータをコールバックメソッドに配信する場合があります。

これは実際には非常に頻繁に発生するため、実行する必要があるのは、現在の時刻newLocationに対するタイムスタンプをチェックしてoldLocation、それらが十分に異なるかどうかを確認することです(アプリのニーズに基づいて決定するのはあなた次第です)。

現在の時刻に対してチェックを行う方法の抜粋を次に示します。

    if ([newLocation.timestamp timeIntervalSinceNow] < 600) // 10 minutes
于 2013-02-07T22:53:18.250 に答える