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]