Bhrigesh
Bhrigesh

Reputation: 871

CLLocation Manager not updating new location

I am calling CLLocationManager and it's calling its delegate method as well. But my problem is, isn't updating its New Location after traveling 1 km.

Here's my code:

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationTimer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self    selector:@selector(updateLocation1:) userInfo:nil repeats:YES];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

// Method did update location - Update location when location change

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
   // this method is calling after every 1 sec interval time..
}

-(void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
      fromLocation:(CLLocation *)oldLocation 
{
     // this method is not calling once also after travelling around a km ....        
}

What am I doing wrong?

Upvotes: 1

Views: 1785

Answers (5)

karthika
karthika

Reputation: 4091

-(void)postCurrentLocationOfDevice
{

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
    self.locationManager.delegate = self;

}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
   CURRENT_LOCATION = [locations objectAtIndex:0];
    [self.locationManager stopUpdatingLocation];

}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CURRENT_LOCATION = newLocation;
    [self.locationManager stopUpdatingLocation];
}

Upvotes: 0

Bhavesh Nayi
Bhavesh Nayi

Reputation: 3656

- (void)viewDidLoad
{
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];

    CLLocation *location = [locationManager location];
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    //[manager stopUpdatingLocation];

    CLLocationCoordinate2D coordinate_currentlocation = [newLocation coordinate];

    float latitude_current = newLocation.coordinate.latitude;
    float longitude_current = newLocation.coordinate.longitude;
}

Upvotes: 1

D-eptdeveloper
D-eptdeveloper

Reputation: 2430

i have done this within my app with the use of this

myLocationManager = [[CLLocationManager alloc] init];
myLocationManager.delegate = self;
myLocationManager.desiredAccuracy = kCLLocationAccuracyBest;    
[myLocationManager startUpdatingLocation];


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                           initWithTitle:@"Error" message:@"Failed to Get Your Location, Please turn on GPS and Restart The Application"delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
    [errorAlert release];
}

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

    if (currentLocation != nil) {
        [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
        [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
    }

    // Stop Location Manager
    [myLocationManager stopUpdatingLocation];
}

Upvotes: 0

TRD
TRD

Reputation: 1027

Your first method

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
   // this method is calling after every 1 sec interval time..
}

is used since iOS 6.

The second one is deprecated since iOS 6 and was used prior to iOS 6. You can use both methods, depending on the system version on the device your app is running at, by adding a helper method.

- (void) locationManager:(CLLocationManager *) manager didUpdateToLocation:(CLLocation *) newLocation fromLocation:(CLLocation *) oldLocation
{
    [self locationManager:manager helperForLocation:newLocation];
}

- (void) locationManager:(CLLocationManager *) manager didUpdateLocations:(NSArray *) locations
{
    if([locations count] > 0)
    {
        [self locationManager:manager helperForLocation:[locations objectAtIndex:[locations count] - 1]];
    }
}

- (void) locationManager:(CLLocationManager *) manager helperForLocation:(CLLocation *) newLocation
{
        // your code what to do with location goes here
}

The locations retrieved by iOS 6 are wrapped in a list and could be more than 1. In my example I take the last one and put it to my helper.

Upvotes: 0

Wain
Wain

Reputation: 119041

You should be calling startUpdatingLocation or startMonitoringSignificantLocationChanges on the location manager for it to start checking for location changes and calling your delegate methods.

locationManager:didUpdateToLocation:fromLocation: is deprecated so you can expect it not to always be used.

If locationManager:didUpdateLocations: is being called then you are receiving location updates.

Upvotes: 1

Related Questions