iOS8: la barra azul "está usando su location" aparece poco después de salir de la aplicación

Me gustaría get la barra azul cuando rastrea en segundo plano, pero no cuando no.

Mi aplicación utiliza services de location todo el time cuando está activo, por lo que en iOS8 utilizo el requestWhenInUseAuthorization en CLLocationManager . Normalmente, la aplicación deja de rastrear tu location cuando la cierras, pero el usuario puede elegir la opción para que la aplicación rastrille su location también en segundo plano. Por lo tanto, tengo la opción de location para UIBackgroundModes en el file Info.plist. Eso funciona perfectamente: al cambiar a segundo plano, la aplicación sigue recibiendo actualizaciones de location y aparece una barra azul como recordatorio de que la aplicación está utilizando services de location. Todo perfecto.

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

 - (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 se ve bastante irritante.

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

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

¿Alguien sabe cómo get la barra azul cuando rastrea en segundo plano, pero no cuando no?

Frecuentemente reportamos cosas a Apple y, a veces, actúan de acuerdo con ello. Para evitar que la barra azul aparezca en breve como se describe en la pregunta, Apple introdujo una nueva propiedad en CLLocationManager en iOS-9. Configúrelo en el momento que sepa que necesitará la location 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á al salir de la aplicación y la location del usuario no estará disponible para su aplicación. Tenga en count que en iOS 9, debe establecer la propiedad para poder usar la location en segundo plano.

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

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

La barra azul "Usando su location" aparece poco después de salir de la aplicación

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

Para mostrar la notificación azul , debe agregar Privacidad – Ubicación cuando esté en uso Descripción de uso en el file Plist (esto es importante, con la location Siempre, la barra azul no apareció nunca)

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

luego estrella la location: locationManager.startUpdatingLocation ()

También anular los methods:

  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() } } } } 

Restring la import !!:

  import CoreLocation 

Y también restring al delegado (CLLocationManagerDelegate) :

  class ViewController: UIViewController, CLLocationManagerDelegate{ 

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

  • establezca NSLocationAlwaysUsageDescription en Info.plist
  • ver Capacidades> Modos de background> Actualizaciones de location
  • en el código locationManager.requestAlwaysAuthorization ()

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

Revisé mi proyecto a background y cuando detuve a todos los administradores de la location, la barra desapareció cuando debería.

Para mostrar la barra azul en el encabezado que su aplicación está utilizando la location al presionar el button de inicio, debe establecer Privacidad – Ubicación cuando está en uso Descripción de uso en el file Plist

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

cuando utiliza self.locationManager.requestAlwaysAuthorization (), no mostrará el encabezado azul

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

También debe configurar el modo de background en las capacidades en destino para la location.