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 manger е, че кешира старото местоположение и известно време връща старото местоположение. За да получите ново местоположение, просто проверете времевия печат на обекта 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 данните от моя телефон към SIM картата. Накратко това изглеждаше като грешка със софтуера iSimulate + SDK. - person nrj; 07.12.2011