This part of code of CLLocationManager
is used to calculate the distance travelled. But the location cache is not removed even after using timeIntervalSinceNow
.
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if(newLocation != nil && oldLocation != newLocation)
{
tempNewLocation = newLocation;
tempOldLocation = oldLocation;
}
NSLog(@"New Location Found");
NSLog(@"- Latitude: %f", newLocation.coordinate.latitude);
NSLog(@"- Longitude: %f", newLocation.coordinate.longitude);
NSLog(@"- Altitude: %f", newLocation.altitude);
NSLog(@"- Course: %f", newLocation.course);
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
NSLog(@"The location age %f",locationAge);
if (locationAge > 2.0)
{
}
else
{
if (tempOldLocation.coordinate.latitude == tempNewLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
{
NSLog(@" Fix location found ");
}
else
{
if(tempNewLocation.coordinate.latitude == tempOldLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
{
NSLog(@"First Time Location Update");
latitudeLongitude.text = [[ NSString alloc] initWithFormat:@"%g , %g", tempNewLocation.coordinate.latitude, tempNewLocation.coordinate.longitude];
totalDistance = 0;
distance.text = @"0 miles";
}
else if ([tempNewLocation distanceFromLocation:tempOldLocation] - tempNewLocation.horizontalAccuracy >= 0)
{
totalDistance += [tempNewLocation distanceFromLocation:tempOldLocation] - (tempNewLocation.horizontalAccuracy / 2);
}
else{
totalDistance += [tempNewLocation distanceFromLocation:tempOldLocation];
}
if (totalDistance < 0) {
distance.text = @"0 miles";
}
else
milesdistance=0.000621371192*totalDistance;
distance.text = [[ NSString alloc] initWithFormat:@"%.1f", milesdistance];
odometerreading.text = [NSString stringWithFormat:@"%09.1f", milesdistance];
mileagerate.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"savedstring"];
float mileagefloat=[self.mileagerate.text floatValue];
amount.text = [NSString stringWithFormat:@"%.2f",mileagefloat * milesdistance];
amountstatus.text=[NSString stringWithFormat:@"$%.2f",mileagefloat * milesdistance];
newnumber=totalDistance;
}
This code doesnt work for me, and when I start tracking, distance is calculated from the place where I last stopped the tracking.
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
NSLog(@"The location age %f",locationAge);
if (locationAge > 2.0)
I found the answer for removing cache. For the first time
didUpdateToLocation
is called, thenewlocation
fetches the cache value, and theold location
is null. And in the second call,newlocation
value is swapped tooldlocation
and thenewlocation
is updated. And hence to get the updated value, the function has to be called twice.I use a counter that counts how many times didUpdateToLocation is called.
I only use the location received after at least 3 calls.
I know 3 is a magic number but i have found that the first 3 calls are cache or very inaccurate.
Take a look at the answer to this question, as it includes code from Apple's sample app "LocateMe" and provides a bit more detail as to what you are trying to do:
https://stackoverflow.com/a/12848776/346098
You want to check the
timestamp
property of the new CLLocation object in your delegate method. By the sounds of it are only interested in lat/long that are no older than XXX seconds.