Andrew
Andrew

Reputation: 7873

didUpdateLocations not being called

I have my object set as the locationManager's delegate, and the didChangeAuthorizationStatus method is called, which does this:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == CLAuthorizationStatus.AuthorizedWhenInUse {
        self.locationManager.startUpdatingLocation()
    }
}

I also have this method, which never gets called following this:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    if locations.count == 0 {
        return
    }

    //Do stuff
}

Any thoughts as to why this might not be being called? I suppose the object being deallocated is an option, but then it'd also be deallocated by the time it hit the authorizationStatus method.

Upvotes: 5

Views: 14455

Answers (3)

ios_dev
ios_dev

Reputation: 1035

It's working in iOS 10 and iOS 11 as well,

Create property of CLLocationManager using strong and add CLLocationManagerDelegate

@property (strong, nonatomic) CLLocationManager *locationManager;

Add below properties into your info.plist file

Privacy - Location When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location Usage Description

Add below method in to your .m file

-(void)getCurrentLocation
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate=self;
    self.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    self.locationManager.distanceFilter=kCLDistanceFilterNone;
    [self.locationManager requestWhenInUseAuthorization];
    [self.locationManager startMonitoringSignificantLocationChanges];
    [self.locationManager startUpdatingLocation];
}

and just call [self getCurrentLocation] method.

Upvotes: 6

timgcarlson
timgcarlson

Reputation: 3146

This is way late for an answer, but I stumbled across this when I was having the same issue (didChangeAuthorizationStatus was being called but not didUpdateLocations). Well of course it's something not code related, but rather I was testing in the simulator which did not have a location set. Thus the location was never found, resulting in didUpdateLocations never being called.

To fix this... in the simulator go to Debug -> Location-> <choose location>.

EDIT It should also be noted that locationManager:didFailWithError: will run if the location is not set in the simulator, as you'd expect.

Upvotes: 23

zisoft
zisoft

Reputation: 23078

Here is a snippet from my app:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    ...
    locationManager.delegate = self
    locationManager.activityType = CLActivityType.Fitness
    locationManager.distanceFilter = 10   // 10m
    locationManager.requestAlwaysAuthorization()

    // get current location
    if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.Authorized {
        locationManager.startUpdatingLocation()
    }
}

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == .Authorized {
        locationManager.startUpdatingLocation()
    }
}

You have to put the NSLocationAlwaysUsageDescription key in your Info.plist and set the value to the authorization question. This is a requirement as of iOS 8.

Upvotes: 0

Related Questions