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?
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.
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{
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.
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
Si vous suivez les étapes ci-dessous, la barre bleue n'apparaîtra pas en mode arrière-plan