when usage requestwheninuseauthorization objective manager description corelocation ios objective-c core-location

ios - requestwheninuseauthorization - location when in use usage description



iOS8: la barra azul "está usando tu ubicación" aparece poco después de salir de la aplicación (6)

Con frecuencia informamos cosas a Apple, y en ocasiones actúan de acuerdo con esto. Precisamente para evitar que la barra azul aparezca brevemente como se describe en la pregunta, Apple ha introducido una nueva propiedad en CLLocationManager en iOS-9. Configúrelo en el momento en que sepa que necesitará la ubicación en segundo plano:

theLocationManager.allowsBackgroundLocationUpdates = YES;

o, de una manera compatible hacia atrás:

if ([theLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { [theLocationManager setAllowsBackgroundLocationUpdates:YES]; }

en Swift:

if #available(iOS 9.0, *) { theLocationManager.allowsBackgroundLocationUpdates = true }

Si esta propiedad no está configurada, la barra azul no aparecerá cuando salga de la aplicación, y la ubicación del usuario no estará disponible para su aplicación. Tenga en cuenta que en iOS 9, debe establecer la propiedad para poder usar la ubicación en segundo plano.

Vea el video WWDC para la explicación de Apple.

Me gustaría obtener la barra azul cuando hago un seguimiento en segundo plano, pero no cuando no.

Mi aplicación utiliza servicios de ubicación todo el tiempo cuando está activa, por lo que en iOS8 utilizo la requestWhenInUseAuthorization en CLLocationManager . Normalmente, la aplicación deja de rastrear su ubicación cuando la cierra, pero el usuario puede elegir la opción para que la aplicación también rastree su ubicación en segundo plano. Por lo tanto, tengo la opción de location para UIBackgroundModes en el archivo Info.plist. Eso funciona perfectamente: cuando se pasa al segundo plano, la aplicación sigue recibiendo actualizaciones de ubicación, y aparece una barra azul como recordatorio de que la aplicación está utilizando servicios de ubicación. Todo perfecto.

Pero el problema es que la barra azul aparece también cuando el usuario no ha elegido rastrear en segundo plano. En ese caso, simplemente detengo las actualizaciones de ubicación de AppDelegate al ingresar el fondo:

- (void) applicationDidEnterBackground:(UIApplication *)application { if (!trackingInBackground) { [theLocationManager stopUpdatingLocation]; } }

La barra azul se muestra solo por un segundo después de cerrar la aplicación, pero todavía parece bastante irritante.

Sé que el uso de requestAlwaysAuthorization lugar de requestWhenInUseAuthorization resolverá el problema, pero no obtendré ninguna barra azul en absoluto, tampoco cuando el seguimiento en segundo plano esté realmente requestWhenInUseAuthorization .

He intentado stopUpdatingLocation en el método applicationWillResignActive: pero eso no hace ninguna diferencia.

¿Alguien sabe cómo obtener la barra azul cuando se realiza un seguimiento en segundo plano, pero no cuando no?


Esto no es un error, todavía tienes un administrador de ubicación activo en alguna parte de tu aplicación. ¿Tiene una vista de mapa con showsUserLocation = YES por ejemplo? Eso podría ser.

Revisé a fondo mi proyecto y cuando detuve a todos los gerentes de ubicación, la barra desapareció cuando debería.


La barra azul solo se muestra cuando habilita las Background Location Updates y solicita la when-in-use authorization en when-in-use authorization en iOS 8.

La barra azul "está usando tu ubicación" aparece poco después de salir de la aplicación

Parece que el administrador de ubicación no puede detenerse de inmediato. Entonces, la barra azul aparecerá hasta que el administrador de ubicación se detenga por completo. O tal vez es solo un error como dijo Keith.


Para mostrar la barra azul en el encabezado que su aplicación utiliza la ubicación al presionar el botón de inicio, debe establecer Privacidad - Ubicación cuando está en uso Descripción de uso en el archivo Plist

self.locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest self.locationManager.requestWhenInUseAuthorization() self.locationManager.pausesLocationUpdatesAutomatically = true self.locationManager.allowsBackgroundLocationUpdates = true

cuando usa self.locationManager.requestAlwaysAuthorization (), entonces no se mostrará el encabezado azul

solo necesita usar self.locationManager.requestWhenInUseAuthorization() luego mostrará el encabezado azul cuando su aplicación esté en segundo plano de que su aplicación esté usando Location

también debe establecer el modo de fondo en las capacidades del destino para la ubicación


Si sigue los pasos a continuación, la barra azul no aparecerá en el modo de fondo

  • establecer NSLocationAlwaysUsageDescription en Info.plist
  • verificar Capacidades> Modos de fondo> Actualizaciones de ubicación
  • en el código locationManager.requestAlwaysAuthorization ()

Para mostrar la notificación azul , debe agregar Privacidad - Ubicación cuando está en uso Descripción del uso en el archivo Plist (esto es importante, con Always Location, la barra azul no apareció nunca)

self.locationManager.delegate = self; self.locationManager.requestWhenInUseAuthorization() self.locationManager.pausesLocationUpdatesAutomatically = true/false self.locationManager.allowsBackgroundLocationUpdates = true

a continuación, marque la ubicación: ubicaciónManager.startUpdatingLocation ()

También anula los métodos:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { print(manager.location?.coordinate.latitude ?? "No data") } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedWhenInUse { if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) { if CLLocationManager.isRangingAvailable() { // do stuff print(manager.location?.coordinate.latitude ?? "No data") locationManager.startUpdatingLocation() } } } }

Recuerde la importación !!:

import CoreLocation

Y también recuerde al Delegado (CLLocationManagerDelegate) :

class ViewController: UIViewController, CLLocationManagerDelegate{