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 delegadolocationManager: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?