184 votes

La boîte de dialogue d'autorisation de l'emplacement actuel disparaît trop rapidement

Mon application prend l'emplacement de l'utilisateur, obtient les coordonnées, et fournit une distance vers ou depuis sa destination ou son origine. Toutes ces destinations possibles sont affichées dans un tableau, de sorte que j'obtiens les coordonnées de l'utilisateur en même temps que je remplis le tableau. Le seul problème est que la vue d'alerte qui demande l'emplacement de l'utilisateur apparaît puis disparaît si rapidement qu'il est impossible de cliquer dessus !

Existe-t-il un moyen de présenter manuellement cette alerte au premier chargement de l'application ? J'ai essayé d'obtenir l'emplacement de l'utilisateur au chargement de l'application pour essayer de forcer l'affichage de l'alerte, mais cela n'a pas fonctionné.

744voto

Zoli Points 1396

Bien que difficile à trouver, la solution à ce problème est assez simple.

Après de nombreux essais et erreurs, j'ai découvert que si la boîte de dialogue d'accès à la localisation s'affiche lorsque vous essayez d'accéder à un service de localisation dans l'application pour la première fois, la boîte de dialogue disparaît d'elle-même (sans aucune interaction de la part de l'utilisateur) si l'icône de l'application est activée. CLLocationManager est libéré avant que l'utilisateur ne réponde à la boîte de dialogue.

Je créais un CLLocationManager dans mon viewDidLoad méthode. Comme il s'agissait d'une instance locale de la méthode, l'instance a été libérée par ARC une fois l'exécution de la méthode terminée. Dès que l'instance a été libérée, le dialogue a disparu. La solution était assez simple. Modifiez le fichier CLLocationManager d'être une variable de niveau méthode à être une variable d'instance de niveau classe. Maintenant, la CLLocationManager n'est libérée que lorsque la classe est déchargée.

4voto

Suresh Points 2562

Je sais que cette réponse est très tardive. Mais elle peut aider quelqu'un. J'ai également rencontré le même problème et j'ai passé une heure à identifier le problème. Au début, mon code était comme ceci.

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

CLLocation *location = locationManager.location;
//my stuff with the location

    [locationManager release];

Maintenant, l'alerte de localisation a disparu rapidement. Lorsque je décommente la dernière ligne, le système fonctionne correctement.

   // [locationManager release];

4voto

Ariel Points 1817

Je suis dans le même cas (du moins d'après les symptômes). Dans mon cas, le problème se situait dans le - (void)applicationWillResignActive:(UIApplication *)application; où je libérais mon CLLocationManager instance dans le cadre de la préparation de la transition de fond. Lorsque je l'ai retiré et laissé uniquement dans - (void)applicationDidEnterBackground:(UIApplication *)application; le problème a disparu.
Le problème est que l'alerte de Core Location DOIT suspendre votre application alors qu'elle est encore au premier plan.
J'espère que cela vous aidera, il m'a fallu beaucoup de temps pour trouver ce bâtard :)

3voto

namannik Points 21

J'ai également rencontré ce problème, mais la solution dans mon cas s'est avérée être complètement différente de la réponse acceptée.

Dans mon application, j'appelais stopUpdatingLocation de applicationWillResignActive . Ce problème est dû au fait que applicationWillResignActive est appelé lorsque la boîte de dialogue d'autorisation apparaît. Cela provoquait stopUpdatingLocation immédiatement après startUpdatingLocation C'est pourquoi le dialogue disparaît immédiatement.

La solution consistait simplement à appeler stopUpdatingLocation de applicationDidEnterBackground à la place.

0voto

Gotschi Points 1452

Vous pourriez utiliser le

+(CLAuthorizationStatus)authorizationStatus

dans iOS4.2 et plus

voir ici

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