tutorial requestwheninuseauthorization manager example corelocation ios ios8 mapkit core-location cllocationmanager

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