ios - requestwheninuseauthorization - por qué self.locationManager stopUpdatingLocation no detiene la actualización de la ubicación
location manager swift tutorial (9)
Estaba trabajando con CLLocationManager
en Swift y creo que es relevante para Swift o Objective-C, pero acabo de crear un booleano que actualizo a verdadero cada vez que recibo la actualización de la ubicación. Ya que en mi caso solo lo necesito una vez en el lanzamiento .. Ejemplo,
// my boolean to stop location updates
var alreadyUpdatedLocation = Bool()
Además, en mi caso, he creado una función de ayuda que cada vez que obtengo los datos / ubicación del usuario, simplemente llamo a mi propio stopUpdatingLocation
esta forma,
// helper function to stop updates
func stopUpdationgLocation() {
// since I received my data within a block, I don''t want to just return whenever it wants to :)
dispatch_async(dispatch_get_main_queue()) {
// the building stop updating location function call
self.locationManager.stopUpdatingLocation()
// my own trick to avoid keep getting updates
self.alreadyUpdatedLocation = true
}
}
Entonces, donde quiera que use las actualizaciones de ubicación que haya recibido, podría hacer esto ...
// avoiding multiple calls after I have received user location
if(self.alreadyUpdatedLocation) {
return
}
¡Espero que ayude!
Problema : parece que no puedo evitar que Core Location
envíe actualizaciones a mi aplicación / seguimiento.
¿Qué estoy haciendo ? En mi viewWillAppear
llamo self.locationManager
y lo paso a un método para mostrar la ubicación del usuario en el mapa (una instancia de MKMapView
). El getter está anulado para verificar la disponibilidad del servicio, para ver si está autorizado. Si es así, allocs/inits
startMonitoringSignificantLocationChanges
y startMonitoringSignificantLocationChanges
y returns
.
En viewDidDisappear
, llamo [self.locationManager stopUpdatingLocation]
. Pero aún puedo ver el icono de ubicación en la barra de estado. Incluso cuando finalizo la aplicación al tocar dos veces el botón de inicio y al cerrarla, el ícono sigue ahí ... incluso después de un período prolongado de tiempo (más de 10 minutos). Cuando voy a la aplicación de configuración, me dice que mi aplicación todavía está usando los servicios de ubicación (icono morado).
Pregunta: ¿Qué me estoy perdiendo aquí? ¿Por qué la actualización de la ubicación no se detiene?
Gracias por adelantado.
Lo opuesto a startMonitoringSignificantLocationChanges
no es stopUpdatingLocation
, es stopMonitoringSignificantLocationChanges
.
Es probable que desee reemplazar startMonitoringSignificantLocationChanges
con startUpdatingLocation
para obtener actualizaciones más regulares, a menos que tenga una razón específica para monitorear solo los cambios de ubicación significativos.
Consulte la documentación de CLLocation para obtener más detalles.
Mi aplicación solicita "siempre" auth. Solo una cierta característica dentro de la aplicación requiere eso. Si el usuario desactiva esa función y luego cierra la aplicación, podemos detener las actualizaciones de ubicación (con el objetivo de ahorrar batería y eliminar el icono de ubicación de la barra de estado). Yo también pensé que la detención no funcionaba porque después de que la aplicación cerrara el ícono de ubicación en la barra de estado todavía estaba allí, aunque mi aplicación era la única que se ejecutaba en mi teléfono con acceso a la ubicación y "en la aplicación cerrar", solo le dije que dejara de actualizar las ubicaciones .
Para mí, la solución fue ser un poco más paciente y luego me di cuenta de que a iOS le toma entre 10 y 15 segundos apagar el hardware de ubicación y actualizar la barra de estado . No tuve que cerrar mi administrador de ubicación ni nada especial, simplemente detuve las actualizaciones en la aplicación, esperé 15 segundos y observé que iOS eliminaba el icono de ubicación de la barra de estado. Espero que esto ayude a alguien por ahí!
Resolví esta configuración nil en la propiedad locationManager después de delegar
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Your code getting coordinates
//Here set nil
locationManager = nil;
}
Si está utilizando el SDK de GoogleMaps para iOS, descubrí que si llama
locationManager.stopUpdatingLocation()
y todavía tengo
mapView.isMyLocationEnabled = true
entonces el icono de gps permanece.
Lo que elegí hacer inicialmente es mostrar la ubicación del usuario en el mapa y luego desactivarlo después de 8 segundos. Esto me funcionó con el SDK de GoogleMaps. Agregué esto en ViewDidLoad:
DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {
self.locationManager.stopUpdatingLocation()
self.mapView.isMyLocationEnabled = false
})
Puede poner el mismo código en viewWillDisappear si prefiere no tener el icono gps en la barra de estado cuando pasa a otra vista.
Yo también acabo de experimentar el mismo problema que Canopus. Parece que incluso si se llama stopUpdatingLocation, el puntero de navegación aún reside en la barra de estado si tengo habilitado showUserLocation. Tal vez esto es un error? Puede ser que esté ejecutando y probando con iOS 4.2.1 y este problema se haya solucionado en un SDK posterior.
Pensaría que si se llama a stopUserLocation, también dejaría de mostrar la ubicación del usuario, ya que la vista en la que lo estoy utilizando ya ha desaparecido y se desasigna posteriormente.
Parece que debe configurar showUserLocation en NO antes de detener las actualizaciones de ubicación del usuario.
De todos modos, en mi método viewDidLoad tengo el siguiente código:
self.mapView.showsUserLocation = YES;
Más código ...
- (void)viewWillDisappear:(BOOL)animated
{
if (locationManager)
{
mapView.showsUserLocation = NO;
[locationManager stopUpdatingLocation];
}
[super viewWillDisappear:animated];
}
- (void)dealloc
{
if (locationManager)
{
[locationManager release];
locationManager = nil;
}
(other code)
}
prueba esto..
if ([CLLocationManager significantLocationChangeMonitoringAvailable])
{
[self.locationManager startMonitoringSignificantLocationChanges];
}
[[self locationManager] stopUpdatingLocation];
Problema : en mi caso utilizo tanto startMonitoringSignificantLocationChanges como startUpdatingLocation . Incluso después de detener la ubicación a través de locationManager.stopMonitoringSignificantLocationChanges () & locationManager.stopUpdatingLocation () . Mi ubicación es llamada continuamente.
Solución : 1. Compruebe si ha invalidado los temporizadores . 2. Inicialice locationManager.delegate = nil .
Estos seguramente solucionarán tu problema.
Rápido:
Tu mapa Y el administrador de ubicación deben detenerse:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
locationManager.stopMonitoringSignificantLocationChanges()
locationManager.stopUpdatingLocation()
mapView.showsUserLocation = false
}
Puede depurar / verificar el uso de los servicios de ubicación allí mismo en Xcode, en el navegador de depuración bajo Energy Impact.