tutorial current annotation ios objective-c cocoa-touch mkmapview core-location

ios - current - mkmapview



Advertencia de Xcode al usar MapKit y CoreLocation (1)

Está llamando requestWhenInUseAuthorization , eso es cierto. ¿Pero estás esperando hasta que obtengas la autorización? No, no lo eres. Usted (como usuario) está tocando Permitir, pero eso está sucediendo demasiado tarde: su código ya ha continuado, yendo directamente a decirle a la vista del mapa que comience a rastrear la ubicación del usuario.

Solo mira los documentos a requestWhenInUseAuthorization cuando requestWhenInUseAuthorization :

Cuando el estado actual de la autorización es kCLAuthorizationStatusNotDetermined, este método se ejecuta de forma asíncrona

¿Obtén éso? Se ejecuta de forma asincrónica . Eso significa que pedir permiso pasa en segundo plano en otro hilo.

Y los documentos continúan diciendo:

Después de que se determina el estado, el administrador de la ubicación entrega los resultados al locationManager:didChangeAuthorizationStatus: del delegado locationManager:didChangeAuthorizationStatus: method

Entonces, implementa ese método. Si acaba de obtener el permiso, esa es la señal de que puede comenzar a usar el administrador de ubicación.

Además, te estás perdiendo un paso importante: no estás verificando cuál es el estado en realidad. Solo debe solicitar autorización si el estado es indeterminado . Si el estado es restringido o denegado, no debe usar el administrador de ubicación; y si se concede el estado, no tiene sentido pedir autorización nuevamente.

Entonces, para resumir, su diagrama de flujo lógico debería ser:

  • Comprobar estado.

  • ¿El estado está restringido o denegado? Detener. No puede usar obtener actualizaciones de ubicación o hacer una ubicación en un mapa.

  • Es el estado concedido? Proceda a obtener actualizaciones de ubicación o haga una ubicación en un mapa.

  • ¿El estado es indeterminado? Solicite autorización y pare. Tratar locationManager:didChangeAuthorizationStatus: como el controlador de finalización para su solicitud de autorización. En ese punto, regrese al inicio del diagrama de flujo.

Estoy intentando usar implementar una instancia de MKMapView , usar CoreLocation para rastrear la ubicación de los usuarios y luego CoreLocation a su ubicación.

Solo quiero rastrear la ubicación del usuario cuando estoy en primer plano. Como mi aplicación está dirigida para iOS8, tengo una entrada plist para la clave NSLocationWhenInUseUsageDescription .

Cuando ejecuto la aplicación por primera vez, la aplicación pregunta si puede acceder a mi ubicación. Después de hacer clic en ''Permitir'', recibo la siguiente advertencia de Xcode:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

... que es un poco confuso, ya que de hecho estoy llamando requestWhenInUseAuthorization , como se puede ver en mi código a continuación:

@property (strong, nonatomic) IBOutlet MKMapView *mapView; @property(nonatomic, retain) CLLocationManager *locationManager; @end @implementation MapView - (void)viewDidLoad { [super viewDidLoad]; [self locationManager]; [self updateLocation]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; self.locationManager = nil; } - (CLLocationManager *)locationManager { //We only want to get the location when the app is in the foreground [_locationManager requestWhenInUseAuthorization]; if (!_locationManager) { _locationManager = [[CLLocationManager alloc] init]; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; } return _locationManager; } - (void)updateLocation { _mapView.userTrackingMode = YES; [self.locationManager startUpdatingLocation]; }

¿Alguien tiene alguna idea de por qué esta advertencia estaría ocurriendo?