Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CLLocation Manager in Swift to get Location of User

I am trying to convert an old app in ObjC to Swift as a practice exercise and have ran in to some issues. The way I had it in the old app, it was establishing the CLLocation Manager and then I would use:

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

which would call automatically:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ } 

and from there I could extract all the information I needed. But in swift, there is no autocompletion of this method and I cannot figure out how to reproduce it. The documentation says that

startUpdatingLocation() 

will still be called by the delegate, but it isn't happening.

This is what I have so far:

import UIKit import corelocation  class ViewController: UIViewController,CLLocationManagerDelegate{  @IBOutlet var gpsResult : UILabel  var manager:CLLocationManager!  override func viewDidLoad() {     super.viewDidLoad()     // Do any additional setup after loading the view, typically from a nib.      manager = CLLocationManager()     manager.delegate = self     manager.desiredAccuracy = kCLLocationAccuracyBest     manager.startUpdatingLocation() }  func locationManager(manager:CLLocationManager, didUpdateLocations locations:AnyObject[]) {     println("locations = \(locations)")     gpsResult.text = "success" } } 

Any help or pointers on where to look would be appreciated. Thanks.

EDIT: Updated from Suggestions, but still not working

EDIT2: Seems to be some bug not allowing the method to work properly in the ViewController

like image 744
Sean Fitz Avatar asked Jun 05 '14 15:06

Sean Fitz


People also ask

How do I ask a user for location in Swift?

Get A User's Location Once Only once location authorization can be requested by using the CLLocationManager method requestLocation() . Implement the CLLocationManagerDelegate method locationManager(:, didUpdateLocations:) to handle the requested user location.

What is location manager in Swift?

Location Manager is a manager written in Swift for iOS which handles the location features provided by Apple. It is fairly simple to use where you can get your current location, current address, custom location and custom address by just a single method call.


2 Answers

You are missing two things. First, you have to ask for permission using requestAlwaysAuthorization or requestWhenInUseAuthorization(). So your viewDidLoad() should be like this:

var locationManager = CLLocationManager()  override func viewDidLoad() {     super.viewDidLoad()     // Do any additional setup after loading the view, typically from a nib.      locationManager.delegate = self     locationManager.desiredAccuracy = kCLLocationAccuracyBest     locationManager.requestAlwaysAuthorization()     locationManager.startUpdatingLocation() } 

Second, edit your Info.plist as indicated here.

like image 138
danilopez.dev Avatar answered Sep 28 '22 01:09

danilopez.dev


First add this two line in plist file

  1. NSLocationWhenInUseUsageDescription

  2. NSLocationAlwaysUsageDescription

Then this is class working complete implement this

import UIKit  import CoreLocation  @UIApplicationMain  class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {  var window: UIWindow? var locationManager: CLLocationManager! var seenError : Bool = false var locationFixAchieved : Bool = false var locationStatus : NSString = "Not Started"  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {     initLocationManager();     return true }  // Location Manager helper stuff func initLocationManager() {     seenError = false     locationFixAchieved = false     locationManager = CLLocationManager()     locationManager.delegate = self     locationManager.locationServicesEnabled     locationManager.desiredAccuracy = kCLLocationAccuracyBest      locationManager.requestAlwaysAuthorization() }  // Location Manager Delegate stuff // If failed func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {     locationManager.stopUpdatingLocation()     if (error) {         if (seenError == false) {             seenError = true            print(error)         }     } }  func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {     if (locationFixAchieved == false) {         locationFixAchieved = true         var locationArray = locations as NSArray         var locationObj = locationArray.lastObject as CLLocation         var coord = locationObj.coordinate          println(coord.latitude)         println(coord.longitude)     } }  // authorization status func locationManager(manager: CLLocationManager!,     didChangeAuthorizationStatus status: CLAuthorizationStatus) {         var shouldIAllow = false          switch status {         case CLAuthorizationStatus.Restricted:             locationStatus = "Restricted Access to location"         case CLAuthorizationStatus.Denied:             locationStatus = "User denied access to location"         case CLAuthorizationStatus.NotDetermined:             locationStatus = "Status not determined"         default:             locationStatus = "Allowed to location Access"             shouldIAllow = true         }         NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)         if (shouldIAllow == true) {             NSLog("Location to Allowed")             // Start location services             locationManager.startUpdatingLocation()         } else {             NSLog("Denied access: \(locationStatus)")         } } } 
like image 21
jayesh kavathiya Avatar answered Sep 28 '22 01:09

jayesh kavathiya