开发者

MapKit - didUpdateToLocation called but userLocation not updated

开发者 https://www.devze.com 2023-02-19 19:35 出处:网络
I have a MKMapView configured like so: mapView = [[MKMapView alloc] init]; [mapView setMapType:MKMapTypeStandard];

I have a MKMapView configured like so:

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

I then initialize a CLLocationManager and call startUpdatingLocation.

I am using iSimulate to send the GPS data from my phone, to the simulator, which seems to be working since the CLLocationManager delegate method is invoked with my correct GPS coordinates. However the MKMapView never moves the blue dot away from Cupertino.

- (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);

}

The above method outputs the following:

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

Even if I manually update the userLocation's coordinate using:

[[mapVie开发者_StackOverflow中文版w userLocation] setCoordinate:[newLocation coordinate]];

The dot still just sits on Cupertino. Am I missing something?


The problem with CLLocation manger is that is caches the old location and some time it returns the old location. To get a new location just check the time stamp of the CLLocation object if it is older than the time limit then ignore this location

-(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
    }
}


The dot still just sits on Cupertino. Am I missing something?

Are you testing this on the simulator? Note that in the simulator, the location dot always remains in Cupertino. Try it on a device - maybe you don't have a bug at all!

0

精彩评论

暂无评论...
验证码 换一张
取 消