Lapinou
Lapinou

Reputation: 1477

Always negative speed iOS

I'm using the delegate method:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

To get the current and old location, I used:

CLLocation *newLocation = [locations lastObject];
self.currentUserLocation = newLocation;

if(self.oldLocation == nil)
{
    self.oldLocation = newLocation;
    return;
}

EDIT 1: I can get the old location now.

But I always have a negative speed when I use [newLocation speed]; = -1

The device used is an iPhone 4s. Do you have an idea ?

Also, for the locationManager, I used kCLLocationAccuracyBestForNavigation and kCLDistanceFilterNone. I can see on the map my current location moving.

EDIT 2:

I finally achieve the issue with the speed using this method:

- (CLLocationSpeed)speedTravelledFromLocation:(CLLocation*)fromLocation;
{
    NSTimeInterval tInterval = [self.timestamp timeIntervalSinceDate:fromLocation.timestamp];
    double distance = [self distanceFromLocation:fromLocation];
    double speed = (distance / tInterval);
    return speed;
}

This method returns the speed calculated from the distance and time deltas between self and fromLocation.

I found this method in this repository: https://github.com/100grams/CoreLocationUtils Hope it will help someone ;)

EDIT 3

Got it! It was because I'm testing on simulator! I tested on a device and the speed using [newLocation speed] is correct!

Thank you for your help. Regards, Lapinou.

Upvotes: 1

Views: 1299

Answers (2)

Duncan Groenewald
Duncan Groenewald

Reputation: 8988

Negative speed usually means you don't have a GPS signal.

Upvotes: 2

Antonio MG
Antonio MG

Reputation: 20410

Why are you expecting the location callback to have 2 or more locations?

This method:

(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

Usually delivers you just one location, except if for some reason multiple locations arrived before that method was called, but you usually will get just one location.

The problem is that you are assuming that that method gives you your previous location along with the new one, and it's not like that.

Upvotes: 1

Related Questions