Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 ?

like image 203
Biranchi Avatar asked Jun 17 '10 04:06

Biranchi


3 Answers

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!

like image 82
Smartcat Avatar answered Nov 04 '22 14:11

Smartcat


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.

like image 38
SebastianView Avatar answered Nov 04 '22 15:11

SebastianView


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.

like image 2
Thomas Müller Avatar answered Nov 04 '22 16:11

Thomas Müller