La boîte de dialog d'autorisation de localization actuelle disparaît trop rapidement

Mon application prend l'location de l'user, obtient les coordonnées et fournit une distance de ou vers leur destination ou leur origine. Toutes ces destinations possibles sont affichées dans une vue de table, donc j'obtiens les coordonnées des users en même time que le remplissage de la table. La seule chose est, la vue d'alerte qui request l'location des users apparaît alors disparaît si vite qu'il est impossible de cliquer dessus!

Est-il possible de présenter manuellement cette alerte lorsque l'application est chargée pour la première fois? J'ai essayé d'get l'location de l'user lorsque l'application se charge pour essayer de forcer l'affichage de l'alerte, mais cela n'a pas fonctionné.

Bien que difficile à localiser, la solution pour cela est assez simple.

Après beaucoup d'essais et d'erreurs, j'ai découvert que lorsque la boîte de dialog d'access à l'location s'affiche pour la première fois, l'access aux services de localization de l'application disparaît (sans intervention de l'user) si l'object CLLocationManager est libéré avant que l'user ne réponde à la boîte de dialog.

Je CLLocationManager une instance de CLLocationManager dans ma méthode viewDidLoad . Comme il s'agissait d'une instance locale de la méthode, l'instance a été libérée par ARC après l'exécution de la méthode. Dès que l'instance a été libérée, le dialog a disparu. La solution était plutôt simple. Remplacez l'instance CLLocationManager par une variable de niveau méthode pour qu'elle soit une variable d'instance de niveau class. Maintenant, l'instance de CLLocationManager n'est libérée qu'une fois la class déchargée.

Je tombe dans le même problème (au less par les symptômes). Dans mon cas, le problème était dans l'application - (void)applicationWillResignActive:(UIApplication *)application; méthode, où je CLLocationManager mon instance CLLocationManager dans le cadre de la préparation de la transition en arrière-plan. Lorsque je l'ai supprimé et laissé seulement dans - (void)applicationDidEnterBackground:(UIApplication *)application; le problème est parti.
La partie délicate est que l'alerte Emplacement principal DO suspend votre application alors qu'elle est toujours au premier plan.
J'espère que cela vous aidera, m'a pris beaucoup de time pour find ce bâtard 🙂

Je sais que c'est une réponse très tardive. Mais cela peut aider quelqu'un. J'ai également fait face au même problème et j'ai passé une heure à identifier le problème. Au début, mon code était comme ça.

 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; CLLocation *location = locationManager.location; //my stuff with the location [locationManager release]; 

Maintenant, l'alerte de localization a rapidement disparu. Lorsque je décommente la dernière ligne, cela fonctionne correctement.

  // [locationManager release]; 

Même symptôme, cause différente: ne pas appeler startUpdatingLocation plus d'une fois de suite .

J'avais accidentellement structuré des choses de telle sorte que le code appelait involontairement startUpdatingLocation deux fois de suite, ce qui est apparemment mauvais. Cela pourrait aussi avoir un rapport avec le choix de la queue puisque j'attendais de commencer la mise à jour en attendant le résultat d'une requête réseau, mais je n'avais pas besoin de faire de magie GCD pour le réparer … n'a pas répété le début.

J'espère que quelqu'un pourra profiter de ma douleur. 🙂

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

Dans mon application, stopUpdatingLocation partir de applicationWillResignActive . Cela a été un problème car applicationWillResignActive est appelée lorsque la boîte de dialog d'autorisation s'affiche. Cela provoquait stopUpdatingLocation immédiatement après startUpdatingLocation , ce qui explique pourquoi le dialog disparaîtrait immédiatement.

La solution consistait simplement à appeler stopUpdatingLocation partir de applicationDidEnterBackground .

Cela m'arrivait en utilisant le simulateur iOS. J'ai déterminé que cela se produisait parce que mon Run Scheme simulait un location. Je pense que cela a le même effet que d'appeler locationManager.startUpdatingLocation() au lancement et qu'il fermait donc la boîte de dialog.

Si vous décochez la case "Autoriser la simulation de l'location" dans la boîte de dialog Modifier les schémas, le problème a été corrigé. Une fois que cela fonctionne comme vous le souhaitez et que l'autorisation est définie, vous pouvez réactiver la simulation d'location et le simulateur fonctionnera désormais correctement.

Swift 4 et iOS 11 :

Veillez à append des lignes de confidentialité (à la fois always et whenInUse ) dans votre file .plist et ajoutez CoreLocation Framework à votre projet

La boîte de dialog d'autorisation de localization s'affiche correctement lorsque j'ai changé:

 locationManager.requestAlwaysAuthorization() 

avec:

 locationManager.requestWhenInUseAuthorization() 

PS .: J'ai essayé TOUS les conseils et tout échoue (request l'autorisation de viewDidLoad , var au lieu de let pour locationManager, ne démarre pas startUpdatingLocation() après la startUpdatingLocation() pense que c'est un bug et j'espère qu'ils le résoudront comme possible ..

vous définissez le plus la variable locationManager en tant qu'object global.

 @interface ViewController : UIViewController { CLLocationManager *locationManager; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; } 

La solution SWIFT 4 @Zoli ressemblera à:

 class WhateverViewController: UIViewController { let locationManager = CLLocationManager() // here is the point of the @Zoli answer // some code override func viewDidLoad() { super.viewDidLoad() // some other code locationManager.requestWhenInUseAuthorization() // some other code } }