Search code examples
iphonecore-locationcllocationmanagercllocation

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


This is the code that I have in my AppDelegate Class

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 1000;  // 1 Km
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
}

And this is the delegate method i have in my AppDelegate Class

    //This is the delegate method for CoreLocation
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

        //printf("AppDelegate latitude %+.6f, longitude %+.6f\n", newLocation.coordinate.latitude, newLocation.coordinate.longitude);

}

Its working in 3.0, 3.1, 3.1.3 , but its not working in 4.0 simulator and device both.

What is the reason ?


Solution

  • 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.