Why the CLLocationManager delegate is not getting called in iPhone SDK 4.0?

I had a similar error, and is solved now. The issue is declaring locationManager variable locally. Declare it instead as a class variable and make sure it is retained either directly or via property retain (or strong if you use ARC). That solves the problem! The issue was de locationManager variable was released and never updated the delegate. Here the code:

.h file:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>


@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
@private
    MKMapView *_mapView;
    CLLocationManager *_locationManager;
}

@property(nonatomic, strong) CLLocationManager *locationManager;

@end

.m file:

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

I hope it helps.


I was going crazy trying to figure out why just one of several classes that use a CLLocationManager could never get a call to any of the CLLocationManagerDelegate methods.

It turns out: that class was initialized from a non-main thread, so its CLLocationManager was created on a non-main thread... it could even have been a temporary thread. Anyhow, wrapping the call to initialize my class with the below was all that it took to getting my CLLocationManager delegate methods to be called.

dispatch_sync(dispatch_get_main_queue(), 
                    ^{
                         // create your class that will create a CLLocationManager here.
                     });

So bottom line: Don't create a CLLocationManager on anything but the main thread, or you'll never get your delegate methods called! I once knew this... just been a long time... sigh. Wasted a day to figure this one out again! Since all the CLLocationManager SO's I read never brought this up, I'm posting it here. Hope it helps someone!


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