cllocationmanager swift ios8

Implementar métodos CLLocationManagerDelegate en Swift



ios8 (5)

Tuve el mismo problema. didUpdateLocations - no funcionaba. Ejecuta tu aplicación. Vaya a la página Configuración -> Privacidad -> Ubicación y apague los Servicios de ubicación. didFailWithError detectará el error sobre los servicios de ubicación ausentes. Luego enciéndelo. Desde ese momento didUpdateLocations captará ubicaciones.

He estado tratando de hacer que esto funcione por un tiempo, y he venido aquí para preguntar: ¿cómo hago para usar los métodos CLLocationManagerDelegate en Swift? He puesto esto en la parte superior de mi clase:

var locationManager = CLLocationManager()

Puse lo siguiente en mi método viewDidLoad :

locationManager.delegate = self locationManager.distanceFilter = kCLDistanceFilterNone locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.startUpdatingLocation()

Y he intentado utilizar estos métodos de delegado sin ningún resultado:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { locationReceived = true } func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { locationReceived = false }

También intenté usar @optional en frente de las funciones, pero Xcode arroja un error de compilación. ¿Algunas ideas?


Primero agrega esta dos líneas en un archivo plist

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription

import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate var seenError : Bool = false var locationFixAchieved : Bool = false var locationStatus : NSString = "Not Started" var locationManager: CLLocationManager! override func viewDidLoad() { super.viewDidLoad() } func initLocationManager() { seenError = false locationFixAchieved = false locationManager = CLLocationManager() locationManager.delegate = self locationManager.locationServicesEnabled locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestAlwaysAuthorization() } 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) } } 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)") } }


Para obtener la ubicación actual del usuario: -

Paso 1: let locationManager = CLLocationManager() // make object of CLLocationManager class.

Paso 2: In viewDidLoad instantiate the CLLocationManager class like,

// Para usar en segundo plano

self.locationManager.requestAlwaysAuthorization() // For use in foreground self.locationManager.requestWhenInUseAuthorization() if (CLLocationManager.locationServicesEnabled()) { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters locationManager.startUpdatingLocation() }

Paso 3: ahora implementa los métodos de delegado de CLLocationManager

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var locValue:CLLocationCoordinate2D = manager.location.coordinate println("locations = /(locValue.latitude) /(locValue.longitude)") }

Paso 4: no olvide agregar NSLocationAlwaysUsageDescription en Info.plist ya que en iOS 8 es obligatorio agregar esto. Esto pedirá permiso para usar la ubicación del usuario.


Necesita agregar la clave NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription a su plist si no lo ha hecho ya, ahora son obligatorios,

iOS8 + requiere que una de estas dos cadenas se configure para usar ubicaciones. Cuál de las dos depende de cómo pretenda solicitar la ubicación.

  • Use NSLocationAlwaysUsageDescription para aplicaciones que quieran usar la ubicación del dispositivo incluso cuando la aplicación no esté abierta y en uso.

  • Use NSLocationWhenInUseUsageDescription para las aplicaciones que quieran usar la ubicación del dispositivo solo cuando la aplicación esté abierta y en uso.

Nota: Cuando agregue las cadenas, antes de compilar y ejecutar, elimine la aplicación de su dispositivo y déjela hacer una nueva instalación. Parece que si la aplicación fue autorizada para usar ubicaciones antes de actualizar a iOS8, no vuelve a solicitar su permiso y no ve que configure esas cadenas. Hacer una instalación de eliminación y limpieza soluciona esto.

Al establecer cualquiera de las cadenas, aparece una ventana emergente de instalación / primer uso en la línea de: "Permitir que" ThisApp "acceda a su ubicación incluso cuando no esté usando la aplicación".

Aquí hay una captura de pantalla del archivo plist .


Este es un hilo viejo, pero ninguno de los anteriores me funcionó en Swift 2.2 xCode 7.3.1.

El problema es que estaba usando:

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) { print("Got location") locationManager.stopUpdatingLocation() }

Y esto nunca fue llamado. Cuando cambié a:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { print("Got location") locationManager.stopUpdatingLocation() }

Todo funcionó. Parece que no se llama al delegado cuando se usa [AnyObject]