ios - bar - didUpdateLocations no se llama
uisearchbar swift 4 (7)
Además en iOS8 debes tener dos cosas extra:
Agregue una clave a su
Info.plist
y solicite autorización al administrador de ubicación para que comience.NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
Es necesario solicitar autorización para el método de ubicación correspondiente.
[self.locationManager requestWhenInUseAuthorization]
[self.locationManager requestAlwaysAuthorization]
Ejemplo de código:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
Fuente: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/
Estoy intentando obtener mi ubicación actual, pero nunca se llama al punto de interrupción en didUpdateLocations.
Gerente de locación:
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];
Método del delegado:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
Confirmé que los servicios de localización y habilitados y autorizados.
¿Por qué el método delegado locationManager no se llama como debería?
Gracias Mike
Asegúrese de haber agregado CLLocationManager como una propiedad.
@property (nonatomic , strong) CLLocationManager *locationManager;
Cuando tuve este problema, se debió a un problema de subprocesos.
Asegúrese de que todos estos métodos se llaman en el hilo principal. Es muy importante que no solo se startUpdatingLocation
método startUpdatingLocation
en el subproceso principal, sino también a los otros.
Puede forzar que el código se ejecute en el hilo principal envolviéndolo dentro
dispatch_sync(dispatch_get_main_queue(), ^{
});
También echa un vistazo a esta respuesta .
Sí, la propiedad fue la solución para mí y es una buena idea verificar que el Servicio de ubicación esté habilitado:
if ([CLLocationManager locationServicesEnabled]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];
}
Si se establece CLLocationManagerDelegate, MapView Delegate también se configura
También verifique la ubicación del simulador, haga clic en Simulador> Depurar> Ubicación, si no hay ningún cambio en el funcionamiento de la ciudad o la unidad de la autopista. Ha funcionado para mí.
Tenga en cuenta que en iOS 11 y versiones posteriores, se debe proporcionar una tercera clave a su lista de información: NSLocationAlwaysAndWhenInUseUsageDescription
Tienes que decirle al simulador qué ubicación simular. Si no especifica una ubicación, nunca se llamará a los métodos de delegado de CLLocationManager
. Puede utilizar el menú del simulador Depurar -> Ubicación. También en Xcode, junto al área de depuración, hay una pequeña flecha de ubicación que aparece cuando se ejecuta la aplicación desde Xcode. Puede usar eso para especificar un archivo GPX para simular el movimiento (aunque no es lo mismo que el dispositivo real).