iosswiftcllocationmanager

didUpdateLocations never called


I'm trying to get the user's location. To do so I have set the following property in the info.plist :

enter image description here

I have also added the following code in my viewDidLoad method as well as the function below. The problem is that the locationManager(manager, didUpdate....) function never gets called, I also never get prompted for permission to access location, even though I have removed and installed the app again. I am testing this on my iPad, not on the simulator. The didFailWithError function never gets called either.

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()



func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("UPDATING")
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    let latitude = locValue.latitude
    let longitude = locValue.longitude
    latitudeText = "\(latitude)"
    longitudeText = "\(longitude)"
    if let a = latitudeText, b = longitudeText {
        print(a)
        print(b)
        self.locationManager.stopUpdatingLocation()
        if (userAlreadyExist()) {
            dispatch_async(dispatch_get_main_queue(), {
                //self.performSegueWithIdentifier("segueWhenLoggedIn", sender: self)
                self.performSegueWithIdentifier("showCamera", sender: self)
                // self.performSegueWithIdentifier("showTabBarController", sender: self)
            })

        }
        else {
            dispatch_async(dispatch_get_main_queue(), {
                self.performSegueWithIdentifier("segueWhenLoggedOut", sender: self)
            })
        }
    }


}

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    print(error.localizedDescription)
}

EDIT :

I have added the following snippet of code :

if CLLocationManager.locationServicesEnabled() {
        print("yes")
    }
    else {
        print("no")
    }

it returns yes. I have also checked on my device, locationServices are enabled, the app is listed there, however all the other apps have "While Using", "Never" or "Always" written next to them, mine doesn't have anything written.


Solution

  • where do you start the location update ? for example:

    //location manager
        lazy var locationManager: CLLocationManager = {
            var _locationManager = CLLocationManager()
            _locationManager.delegate = self
            _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            _locationManager.activityType = . automotiveNavigation
            _locationManager.distanceFilter = 10.0  // Movement threshold for new events
            _locationManager.allowsBackgroundLocationUpdates = true // allow in background
    
            return _locationManager
        }()
    
    
        if CLLocationManager.locationServicesEnabled() {
                    locationManager.startUpdatingLocation() // start location manager
    
                }
    

    here is a working conroller code: also important to to set up Custom iOS Target Properties.

    Add these two lines to the Info.plist:

    NSLocationWhenInUseUsageDescription

    NSLocationAlwaysUsageDescription

    //
    //  ViewController.swift
    //  LocationTest2
    
    
    import UIKit
    import CoreLocation
    
    class ViewController: UIViewController {
    
        //location manager
        lazy var locationManager: CLLocationManager = {
            var _locationManager = CLLocationManager()
            _locationManager.delegate = self
            _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            _locationManager.activityType = . automotiveNavigation
            _locationManager.distanceFilter = 10.0  // Movement threshold for new events
          //  _locationManager.allowsBackgroundLocationUpdates = true // allow in background
    
            return _locationManager
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
    
            //allow location use
            locationManager.requestAlwaysAuthorization()
    
            print("did load")
            print(locationManager)
    
            //get current user location for startup
           // if CLLocationManager.locationServicesEnabled() {
                locationManager.startUpdatingLocation()
           // }
        }
    }
    
    
    // MARK: - CLLocationManagerDelegate
    extension ViewController: CLLocationManagerDelegate {
    
        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
            for location in locations {
    
                print("**********************")
                print("Long \(location.coordinate.longitude)")
                print("Lati \(location.coordinate.latitude)")
                print("Alt \(location.altitude)")
                print("Sped \(location.speed)")
                print("Accu \(location.horizontalAccuracy)")
    
                print("**********************")
    
    
            }
        }
    
    }