11 votes

Les services de localisation ne s'arrêtent pas lorsque l'application est fermée

Je développe actuellement une application iPhone qui nécessite des services de localisation pour diverses utilisations, y compris la RA.

J'ai tout testé sur simulateur et sur mon iPhone 3GS et tout s'est bien passé.

J'ai récemment testé sur iPhone4 et sur iPad2 et le service de localisation (la petite icône dans la barre d'état) continue à s'afficher même si je tue manuellement l'application ! La seule façon de désactiver cette icône est d'arrêter manuellement le service de localisation de mon application dans les paramètres.

Quelqu'un sait-il quelque chose à ce sujet ? Si nécessaire, je peux poster mon code.

Merci d'avance

Edit :

Lorsque je tue l'application, que je vais dans les services de localisation, que j'éteins mon application, l'icône de localisation disparaît. Mais quand je la rallume, elle réapparaît ! Est-ce normal ?

9voto

Geoffroy Points 5173

J'ai trouvé la réponse ! Cela vient de la surveillance des régions, que j'ai activée auparavant, mais j'ai supprimé tout le code qui l'utilisait il y a plusieurs semaines.

Comme je l'avais déjà testé sur l'iPad, et même si j'ai supprimé et réinstallé l'application, le système semble avoir conservé des informations sur la région que je surveillais.

Ainsi, comme décrit par le documentation l'iOS a continué à localiser mon application, tout comme startMonitoringSignificantLocationChanges.

Merci pour vos réponses, cela m'a permis de mieux comprendre le système de localisation et la façon de l'utiliser efficacement (en particulier grâce à progrmr y Bill Brasky )

8voto

progrmr Points 32412

On dirait que votre application passe en arrière-plan et utilise toujours CLLocation. Vous pouvez arrêter CLLOcationManager lorsque vous recevez la notification que votre application n'est plus active, c'est le meilleur moyen. Puis reprenez-la lorsqu'elle devient active. La réponse à cette question montre comment faire cela. aquí

[EDIT] Lorsque votre application passe en arrière-plan ou cesse d'être active pour une raison quelconque (par exemple, un appel téléphonique), vous devez arrêter les services de localisation à ce moment-là. Vous devez vous abonner aux notifications et fournir une méthode pour arrêter et démarrer les services de localisation, quelque chose comme ceci :

-(void)appDidBecomeActiveNotif:(NSNotification*)notif
{
    [locationManager startUpdatingLocation];
}

-(void)appWillResignActiveNotif:(NSNotification*)notif
{
    [locationManager stopUpdatingLocation];
}

-(void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveNotif:) name:UIApplicationDidBecomeActiveNotification object:nil];         
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActiveNotif:) name:UIApplicationWillResignActiveNotification object:nil]; 
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

2voto

Bill Burgess Points 8217

J'ai rencontré exactement le même problème en utilisant les outils de surveillance des régions. Peu importe ce que je faisais pour désactiver les régions, la flèche restait. J'ai finalement résolu le problème en nettoyant les appels à locationManager. Si vous fermez votre vue et n'avez pas besoin du gestionnaire d'emplacement, mettez-le à nil et/ou libérez-le. Si vous surveillez l'emplacement en arrière-plan, il y restera, mais si ce n'est pas le cas, assurez-vous que vous nettoyez tous vos contrôles d'emplacement.

Il semble qu'il s'agisse d'un bug, mais comme je l'ai découvert, ce n'est pas le cas. Il faut juste un peu plus de nettoyage.

2voto

Simon Tillson Points 96

Je me bats avec ce problème depuis un certain temps, et je pense que j'ai enfin trouvé la solution

Si le service de localisation ne s'arrête pas lorsque vous le lui demandez, ce n'est pas parce que vous ne l'avez pas arrêté ou libéré correctement. D'après mon expérience, le problème est causé par la libération et la réaffectation du CLLocationManager lui-même.

Si votre code libère votre CLLocationManager dans applicationDidEnterBackground, puis en alloue un nouveau dans applicationDidEnterForeground, etc., vous aurez probablement ce problème.

La solution est la suivante :

  1. Ne créez votre objet CLLocationManager qu'une seule fois, dans l'applicationDidFinishLaunching.
  2. Pour commencer, appelez startUpdatingLocation, startMonitoringSignificantLocationChanges etc. comme d'habitude.
  3. Pour arrêter les mises à jour, appelez normalement les fonctions appropriées stopUpdatingLocation, stopMonitoringSignificantLocationChanges, etc.
  4. Ne relâchez jamais, au grand jamais, votre CLLocationManager et ne mettez jamais sa référence à nil (sauf peut-être dans l'applicationWillTerminate, mais cela ne fera probablement aucune différence).

De cette façon, je suis passé d'une situation où mon application continuait à utiliser les services de localisation jusqu'à 12 heures après la mise en arrière-plan de mon application, à une situation où la flèche des services de localisation disparaissait dans les 10 secondes suivant la mise en arrière-plan avec cette nouvelle approche.

Remarque : testé sur un iPhone 4S fonctionnant sous iOS 5.1.1. Pour obtenir des résultats précis sur les performances de votre application à cet égard, assurez-vous d'aller dans Réglages->Services de localisation->Services système et de désactiver l'interrupteur de l'icône de la barre d'état. De cette façon, la flèche de la barre d'état reflétera précisément l'utilisation des applications seules.

1voto

EricLeaf Points 723

On peut supposer qu'il s'agit de faire en sorte que les utilisateurs n'aient pas besoin de regarder la barre pour s'apercevoir qu'une application malicieuse utilise les services de localisation. Cette icône apparaît lorsque vous utilisez des services de localisation et reste ensuite pendant un temps indéterminé.

Il s'agit d'un comportement intentionnel : Apple veut que les utilisateurs sachent quelles applications utilisent leur localisation. Il semble que ce soit des données sensibles, n'est-ce pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X