MapKit - didUpdateToLocation вызывается, но userLocation не обновляется

У меня MKMapView настроен так:

mapView = [[MKMapView alloc] init];     
[mapView setMapType:MKMapTypeStandard];
[mapView setShowsUserLocation:YES];
[mapView setDelegate:self];

Затем я инициализирую CLLocationManager и вызываю startUpdatingLocation.

Я использую iSimulate для отправки данных GPS со своего телефона на симулятор, который, похоже, работает поскольку метод делегата CLLocationManager вызывается с моими правильными координатами GPS. Однако MKMapView никогда не перемещает синюю точку за пределы Купертино.

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation {

NSLog(@"Did Update Location = %f / %f", [newLocation coordinate].latitude, [newLocation coordinate].longitude);

NSLog(@"Current User Location = %f / %f", [[mapView userLocation] coordinate].latitude, [[mapView userLocation] coordinate].longitude);

}

Вышеупомянутый метод выводит следующее:

>>> Did Update Location = 40.740100 / -73.989900 # Correct
>>> Current User Location = 37.331693 / -122.030457 # Cupertino... Incorrect

Даже если я вручную обновлю координату userLocation, используя:

[[mapView userLocation] setCoordinate:[newLocation coordinate]];

Точка по-прежнему сидит на Купертино. Я что-то упускаю?


person nrj    schedule 24.03.2011    source источник


Ответы (2)


Проблема с менеджером CLLocation заключается в том, что он кэширует старое местоположение и некоторое время возвращает старое местоположение. Чтобы получить новое местоположение, просто проверьте метку времени объекта CLLocation, если она старше ограничения по времени, а затем проигнорируйте это местоположение.

-(void) locationManager:(CLLocationManager*)manager
    didUpdateToLocation:(CLLocation*)newLocation
    fromLocation:(CLLocation*) oldLocation
{
    NSDate* time = newLocation.timestamp;
    NSTimeInterval timePeriod = [time timeIntervalSinceNow];
    if(timePeriod < 2.0 ) { //usually it take less than 0.5 sec to get a new location but you can use any value greater than 0.5 but i recommend 1.0 or 2.0
        [manager stopUpdatingLocation];
        // process the location
    } else {
        // skip the location
    }
}
person Inder Kumar Rathore    schedule 31.03.2011
comment
он никогда не попадет внутрь цикла, и вы никогда не получите новое местоположение, просто проверьте его ... - person shankar; 19.01.2013

Точка по-прежнему сидит на Купертино. Я что-то упускаю?

Вы это тестируете на симуляторе? Обратите внимание, что в симуляторе точка местоположения всегда остается в Купертино. Попробуйте на устройстве - может у вас вообще нет бага!

person Rónán Ó Braonáin    schedule 06.12.2011
comment
Если вы прочитаете вопрос, то увидите, что я использовал iSimulate для отправки данных GPS со своего телефона на сим-карту. Короче говоря, это казалось ошибкой с программным обеспечением iSimulate + SDK. - person nrj; 07.12.2011