web-dev-qa-db-fra.com

pourquoi self.locationManager stopUpdatingLocation n'arrête pas la mise à jour de la localisation

Problème : Il semble que je ne peux pas empêcher Core Location d'envoyer des mises à jour à mon application/tracking.

Qu'est-ce que je fais : Dans ma viewWillAppear, j'appelle self.locationManager et le transmet à une méthode pour afficher l'emplacement de l'utilisateur sur la carte (une instance de MKMapView). Le getter est surchargé pour vérifier la disponibilité du serive, pour voir s'il est autorisé. Si tel est le cas, allocs/inits et startMonitoringSignificantLocationChanges et returns.

Dans viewDidDisappear, j'appelle [self.locationManager stopUpdatingLocation]. Mais je peux quand même voir l’icône de localisation dans la barre d’état. Même lorsque je ferme l'application en appuyant deux fois sur le bouton d'accueil et en le fermant, l'icône est toujours là ... même après une période prolongée (plus de 10 minutes). Lorsque je vais dans l'application Paramètres, cela me dit que mon application utilise toujours les services de localisation (icône violette). 

Question: Qu'est-ce qui me manque ici? Pourquoi la mise à jour de l'emplacement ne s'arrête pas?

Merci d'avance.

23
Canopus

L'opposé de startMonitoringSignificantLocationChanges n'est pas stopUpdatingLocation, c'est stopMonitoringSignificantLocationChanges.

Vous souhaitez probablement remplacer startMonitoringSignificantLocationChanges par startUpdatingLocation pour des mises à jour plus régulières, à moins que vous n'ayez une raison spécifique de ne surveiller que les changements d'emplacement importants.

Consultez la documentation CLLocation pour plus de détails.

16
jnic

Moi aussi j'ai juste connu le même problème que Canopus. Il semble que même si stopUpdatingLocation est appelée, le pointeur de navigation réside toujours dans la barre d'état si l'option showUserLocation est activée. C'est peut-être un bug? C’est peut-être ce que je suis en train d’exécuter et de tester avec iOS 4.2.1 et ce problème a peut-être été résolu dans un SDK ultérieur.

Je pensais que si stopUserLocation était appelé, il ne montrerait plus l'emplacement de l'utilisateur, car la vue dans laquelle je l'utilise a déjà disparu et est désallouée par la suite.

Il semble que vous deviez définir showUserLocation sur NO avant d'arrêter les mises à jour d'emplacement utilisateur.

Quoi qu'il en soit, dans ma méthode viewDidLoad, j'ai le code suivant:

self.mapView.showsUserLocation = YES;

Plus de code ...

- (void)viewWillDisappear:(BOOL)animated
{    
    if (locationManager)
    {
        mapView.showsUserLocation = NO;
        [locationManager stopUpdatingLocation];
    }

    [super viewWillDisappear:animated];
}

- (void)dealloc
{
    if (locationManager)
    {
        [locationManager release];
        locationManager = nil;
    }

    (other code)
}
13
Christopher

J'ai résolu ce paramètre nil à la propriété locationManager après le délégué

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    // Your code getting coordinates 
    //Here set nil
    locationManager = nil;

}
2
iOScar182

Mon application demande "toujours" l'auth. Seule une certaine fonctionnalité de l'application l'exige. Si l'utilisateur désactive cette fonctionnalité, à la fermeture de l'application, nous pouvons arrêter les mises à jour d'emplacement (l'objectif étant d'économiser la batterie et de supprimer l'icône de localisation de la barre d'état). Moi aussi, je pensais que m'arrêter ne fonctionnait pas, car après la fermeture de l'application, l'icône d'emplacement dans la barre d'état était toujours là, même si mon application était la seule application fonctionnant sur mon téléphone avec accès à la localisation et «fermeture d'application», je lui ai simplement dit d'arrêter de mettre à jour les lieux. .

Pour moi, la solution consistait à être un peu plus patient, puis je me suis rendu compte que Il faut environ 10 à 15 secondes à iOS pour désactiver le matériel de localisation et mettre à jour la barre d'état . Je n'ai pas eu à supprimer mon gestionnaire de localisation ou quoi que ce soit de spécial, j'ai juste arrêté les mises à jour à la fermeture de l'application, attendu 15 secondes et observé iOS supprimer l'icône de lieu de la barre d'état. J'espère que cela aide quelqu'un là-bas!

1
John Erck

Je travaillais avec CLLocationManager dans Swift et je pense que cela concerne Swift ou Objective-C, mais je viens de créer un booléen que je mets à jour à chaque fois que j'ai reçu la mise à jour de la localisation. Comme dans mon cas, j'en ai juste besoin une fois au lancement. Exemple,

// my boolean to stop location updates
var alreadyUpdatedLocation = Bool()

En outre, dans mon cas, j'ai créé une fonction d'assistance qui appelle chaque fois que j'obtiens les données/l'emplacement de l'utilisateur que j'appelle ma propre stopUpdatingLocation comme ceci,

// 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

    }
}

Ensuite, où que vous utilisiez les mises à jour d'emplacement que vous avez reçues, vous pouvez le faire ...

// avoiding multiple calls after I have received user location
if(self.alreadyUpdatedLocation) {
        return
}

J'espère que ça aide!

1
NorthBlast

Rapide:

Votre gestionnaire de carteET- doit être arrêté:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        locationManager.stopMonitoringSignificantLocationChanges()            
        locationManager.stopUpdatingLocation()
        mapView.showsUserLocation = false

    }

Vous pouvez déboguer/vérifier l’utilisation des services de localisation directement dans Xcode, dans le navigateur de débogage sous Impact énergétique.

1
Juan Boero

essaye ça..

    if ([CLLocationManager significantLocationChangeMonitoringAvailable])
            {
                [self.locationManager startMonitoringSignificantLocationChanges];


            }

 [[self locationManager] stopUpdatingLocation];
0
Kiran K

Problème : Dans mon cas, j'utilise les deux startMonitoringSignificantLocationChanges et startUpdatingLocation . Même après avoir arrêté l'emplacement via locationManager.stopMonitoringSignificantLocationChanges () & locationManager.stopUpdatingLocation () . Mon emplacement est appelé en continu.

Solution : 1. Vérifiez si vous avez invalidé les minuteries . 2. Initialisez locationManager.delegate = nil .

Celles-ci vont sûrement résoudre votre problème.

0
Sarthak Sharma

Si vous utilisez le SDK GoogleMaps pour iOS, j'ai constaté que si vous appelez 

locationManager.stopUpdatingLocation() 

et ont encore 

mapView.isMyLocationEnabled = true

alors l'icône gps reste.

Ce que j'ai choisi de faire, c'est d'abord d'indiquer l'emplacement de l'utilisateur sur la carte, puis de l'éteindre au bout de 8 secondes. Cela a fonctionné pour moi en utilisant le SDK GoogleMaps. J'ai ajouté ceci dans ViewDidLoad:

DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {
            self.locationManager.stopUpdatingLocation()
            self.mapView.isMyLocationEnabled = false
        }) 

Vous pouvez mettre le même code dans viewWillDisappear si vous préférez ne pas avoir l’icône GPS dans la barre d’état lorsque vous passez à une autre vue. 

0
D. Rothschild