requestwheninuseauthorization - ¿Cómo usar MKMapView "Muestra la ubicación del usuario" en iOS8?
location manager swift tutorial (2)
requestWhenInUseAuthorization
is asynchronous: asegúrese de estar escuchando el estado de cambio de autorización en su delegado de vista de mapa antes de tratar de rastrear o mostrar la ubicación del usuario.
Cuando agrega un componente MKMapView
a la vista en Interface Builder, existen casillas de verificación que le permiten configurar lo que muestra:
Cuando marque "Ubicación del usuario", automáticamente se mostrará la ubicación del usuario en el mapa.
Sin embargo, desde iOS 8 se supone que debes solicitar permiso de ubicación antes de mostrar la ubicación del usuario. Si no lo hace, aparece la advertencia "Intentando iniciar las actualizaciones de ubicación de MapKit sin avisar" en la consola.
Así que agregué una clave NSLocationWhenInUseUsageDescription
al plist y agregué este código a viewDidLoad
:
if CLLocationManager.authorizationStatus() == .NotDetermined {
CLLocationManager().requestWhenInUseAuthorization()
}
Sin embargo, esto no parece funcionar. Obtengo una ventana emergente que me pide permiso, pero antes de seleccionar una respuesta, se oculta sola, el mapa se carga debajo y aparece la advertencia en la consola.
Sé que puedo establecer la propiedad showsUserLocation
en el código, solo después de obtener el permiso; pero mi punto es que hay una casilla de verificación en IB que se supone que hace lo mismo, excepto que inicia el seguimiento de inmediato. ¿Eso significa que no se supone que usemos esta casilla desde iOS 8? ¿O lo estoy usando incorrectamente?
-
Actualización: en realidad, la ventana emergente se oculta por sí misma, independientemente de si "establece la ubicación del usuario" está configurado o no. Intenté hacerlo en viewWillAppear
o viewDidAppear
, pero eso no ayudó. Así que no estoy seguro de dónde se supone que requestwhenInUseAuthorization
llamar a requestwhenInUseAuthorization
cuando se utiliza un MKMapView
...
CLLocationManager
su instancia de CLLocationManager
después de que el método finalizó la ejecución. Tan pronto como se lanzó la instancia, el cuadro de diálogo desapareció. La solución fue bastante simple. Cambie la instancia de CLLocationManager de una variable de nivel de método para que sea una variable de instancia de nivel de clase, y haga que sea fuerte : esto es para ObjC :)
Para Swift ... haz algo como eso:
class YourViewController: UIViewController,CLLocationManagerDelegate {
...
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Ask for permission for location
locationManager.delegate = self
if(locationManager.respondsToSelector("requestAlwaysAuthorization")) {
locationManager.requestAlwaysAuthorization()
//or
//locationManager.requestWhenInUseAuthorization()
}
...
}
así que ... no use CLLocationManager().requestWhenInUseAuthorization()
- en su lugar utilice locationManager.requestWhenInUseAuthorization()
- locationManager declaró temprano