didUpdateLocation Method Never Called

14,731

Solution 1

HI, your codes seems ok. now these can be possible reasons :

on your init: try to check if there is locationServicesEnabled or not.

locationManager = [[CLLocationManager alloc] init];
if(locationManager.locationServicesEnabled == NO){
    //Your location service is not enabled, Settings>Location Services  
}

other reason, you may disallow to get location to your app. solution: simply remove your application from iPhone and re-build, now it should popup dialog to Allow location.

use this to check error

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error
{       
    NSLog(@"Error while getting core location : %@",[error localizedFailureReason]);
    if ([error code] == kCLErrorDenied) {
        //you had denied 
    }
    [manager stopUpdatingLocation];
}

otherwise all seems ok, you were already running ios 4.0 , which can be install in iPhone 3G and later, if it was iPhone 2g, then this problem may occur.

Solution 2

Furthermore in iOS8 you must have two extra things:

  • Add a key to your Info.plist and request authorization from the location manager asking it to start.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • You need to request authorization for the corresponding location method.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

Code example:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

Source: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Solution 3

Make sure you added CLLocationManager as a property.

@property (nonatomic , strong) CLLocationManager *locationManager;

Solution 4

If you are testing this on the simulator it will not work.

This happens because that method is only called when the device changes location (and the simulator never changes location).

Solution 5

Does -locationManager:didFailWithError: in your delegate ever get called? Maybe you denied access to location data at some point and now don't get prompted, but access is denied.

Share:
14,731
Akshay Aher
Author by

Akshay Aher

I am iPhone/iPad application Developer.I am here to share knowledge

Updated on July 06, 2022

Comments

  • Akshay Aher
    Akshay Aher almost 2 years

    I am making one app on iphone sdk4.0.In that did update location method never called. I have given my code below.Please help.Thanks in advance.

    -(id)init
    {
        [super init];
    
        obj=[[UIApplication sharedApplication]delegate];
    
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        //locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
        [locationManager startUpdatingLocation];
    
        return self;
    
    }
    
    -(void)locationManager:(CLLocationManager *)manager
       didUpdateToLocation:(CLLocation *)newLocation
              fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"%f",newLocation.coordinate.latitude);
    
        NSLog(@"%f",newLocation.coordinate.longitude);
    
        obj=[[UIApplication sharedApplication]delegate];
    
        location=[[CLLocation alloc]initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
        obj.lattitude1=[NSString stringWithFormat:@"%f",newLocation.coordinate.latitude];
    
        obj.longitude1=[NSString stringWithFormat:@"%f",newLocation.coordinate.longitude];
        //location=[[CLLocation alloc]initWithLatitude:39.9883 longitude:-75.262227];
    }
    
    • Akshay Aher
      Akshay Aher over 13 years
      finally it worked...i didn't do anything.i just made one new project and copied all classes in it.i don't know how?but it worked..
  • Akshay Aher
    Akshay Aher over 13 years
    No..I am not checking on Simulator..I am checking it on iphone device
  • Zebs
    Zebs over 13 years
    Have you tried calling for the current location manually and making sure you have a valid location? You can do this using locationManager.location.
  • Rui Peres
    Rui Peres over 10 years
    This is not true, you can simulate movement now. Simulator -> Debug -> Location
  • bshirley
    bshirley over 9 years
    … and in general the Always methods are discouraged, use the others if you're not sure what you're doing.
  • user3182143
    user3182143 almost 8 years
    Gabriel you have showed me the good way.I got the solution now.I tried to call the didupdateLocation method but it did not call even though I applied everything except your suggestion.Finally I applied CLLocationManager as a property.Now the delegate method is called and I get the update location(Lat,long) value.
  • user3182143
    user3182143 almost 8 years
    Could you please tell me the reason or explanation about property CLLocationManager and why does not work without propert?
  • Gabriel.Massana
    Gabriel.Massana almost 8 years
    Because if it is a property it have an strong reference. Without being a property it gets deallocated outside the method. So it can not receive the callbacks from the delegate. @user3182143