web-dev-qa-db-fra.com

iOS8: la barre bleue "utilise votre position" apparaît peu de temps après avoir quitté l'application

Je voudrais obtenir la barre bleue lors du suivi en arrière-plan, mais pas quand ce n'est pas le cas.

Mon application utilise les services de localisation tout le temps lorsqu'elle est active, donc dans iOS8 j'utilise le requestWhenInUseAuthorization sur CLLocationManager. Normalement, l'application arrête de suivre votre position lorsque vous la fermez, mais l'utilisateur peut également choisir de laisser l'application suivre sa position en arrière-plan. Par conséquent, j'ai l'option location pour UIBackgroundModes dans le fichier Info.plist. Cela fonctionne parfaitement: lorsque vous passez en arrière-plan, l'application continue de recevoir des mises à jour de localisation et une barre bleue apparaît pour rappeler que l'application utilise les services de localisation. Tout est parfait.

Mais le problème est que la barre bleue apparaît également lorsque l'utilisateur n'a pas choisi de suivre en arrière-plan. Dans ce cas, j'arrête simplement les mises à jour de localisation depuis l'AppDelegate lorsque j'entre en arrière-plan:

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

La barre bleue ne s'affiche qu'une seconde après la fermeture de l'application, mais elle semble toujours assez irritante.

Je sais que l'utilisation de requestAlwaysAuthorization au lieu de requestWhenInUseAuthorization résoudra le problème, mais je n'obtiendrai aucune barre bleue du tout, pas plus lorsque le suivi en arrière-plan est réellement activé.

J'ai essayé de stopUpdatingLocation déjà dans le applicationWillResignActive:, mais cela ne fait aucune différence.

Quelqu'un sait-il comment obtenir la barre bleue lors du suivi en arrière-plan, mais pas quand ce n'est pas le cas?

38
fishinear

Nous signalons fréquemment des choses à Apple, et parfois ils agissent en conséquence. Exactement pour empêcher la barre bleue d'apparaître brièvement comme décrit dans la question, Apple a introduit une nouvelle propriété sur CLLocationManager dans iOS-9. Définissez-la au moment où vous vous connaissez aura besoin de l'emplacement en arrière-plan:

theLocationManager.allowsBackgroundLocationUpdates = YES;

ou, d'une manière rétrocompatible:

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

à Swift:

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

Si cette propriété n'est pas définie, la barre bleue n'apparaîtra pas lorsque vous quittez l'application et l'emplacement utilisateur n'est pas disponible pour votre application. Notez que dans iOS 9, vous must définissez la propriété afin de pouvoir utiliser l'emplacement en arrière-plan.

Voir la vidéo WWDC pour l'explication d'Apple.

15
fishinear

Pour afficher la notification bleue vous devez ajouter Confidentialité - Emplacement Lorsque vous utilisez la description d'utilisation dans le fichier Plist (c'est important, avec Always Location la barre bleue n'apparaît jamais)

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

puis placez l'emplacement: locationManager.startUpdatingLocation ()

Remplacez également les méthodes:

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

N'oubliez pas l'importation !!:

 import CoreLocation

Et n'oubliez pas non plus le Délégué (CLLocationManagerDelegate):

 class ViewController: UIViewController, CLLocationManagerDelegate{
2
Alberto Bailac

La barre bleue ne s'affiche que lorsque vous activez Background Location Updates et demande when-in-use authorization dans iOS 8.

La barre bleue "utilise votre position" apparaît peu de temps après avoir quitté l'application

On dirait que le gestionnaire de localisation ne peut pas s'arrêter immédiatement. La barre bleue apparaîtra donc jusqu'à l'arrêt complet du gestionnaire de position. Ou peut-être que c'est juste un bug comme l'a dit Keith.

2
PowHu

Pour afficher la barre bleue sur l'en-tête indiquant que votre application utilise l'emplacement lorsque vous appuyez sur le bouton d'accueil, vous devez définir Confidentialité - Emplacement lors de l'utilisation Description de l'utilisation dans le fichier Plist

 self.locationManager.delegate = self;

 locationManager.desiredAccuracy = kCLLocationAccuracyBest

 self.locationManager.requestWhenInUseAuthorization()

 self.locationManager.pausesLocationUpdatesAutomatically = true

 self.locationManager.allowsBackgroundLocationUpdates = true

lorsque vous utilisez self.locationManager.requestAlwaysAuthorization (), il n'affichera pas l'en-tête bleu

vous avez seulement besoin d'utiliser self.locationManager.requestWhenInUseAuthorization() puis il affichera l'en-tête bleu lorsque votre application est en arrière-plan que votre application utilise Location

vous devez également définir le mode d'arrière-plan dans les capacités de la cible pour l'emplacement

0
priyaranjan

Si vous suivez les étapes ci-dessous, la barre bleue n'apparaîtra pas en mode arrière-plan

  • définir NSLocationAlwaysUsageDescription dans Info.plist
  • check Capabilities> Background Modes> Location Updates
  • dans le code locationManager.requestAlwaysAuthorization ()
0
mckanet