2017-08-16 2 views
2

Mon application semble fonctionner correctement sur chaque utilisation sauf le premier. Je demande l'autorisation de l'utilisateur et j'ai les clés appropriées dans le plist mais le reste de viewDidLoad après les lignes demandant l'autorisation ne s'exécute pas. J'ai joint les points de rupture ci-dessous et le point de rupture 2 n'est pas atteint la première fois que l'application est utilisée.Après requestAuthorization sur le premier chargement le reste de viewDidLoad n'est pas exécuté et la ligne suivante saute aux fonctions de délégué (swift 3)

Je suis assez sûr qu'une fois l'autorisation donnée, il suffit de passer à la fonction func locationManager dans l'extension.

Je pourrais attendre jusqu'à la fin pour demander l'autorisation jusqu'à ce que tout le reste soit réglé mais je ne sais pas si c'est le meilleur, ou le seul moyen, de sortir.

Merci,

class MapController: UIViewController, GMSMapViewDelegate { 

    var locationManager = CLLocationManager() 
    var currentLocation: CLLocation? 

    @IBOutlet var mapView: GMSMapView! 

    override func viewDidLoad(){ 
     super.viewDidLoad() 

     locationManager = CLLocationManager() 
--------------------------> breakpoint 1 
     locationManager.requestAlwaysAuthorization() 
     locationManager.requestWhenInUseAuthorization() 
-------------------------> breakpoint 2 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.distanceFilter = 50 
     locationManager.startUpdatingLocation() 
     locationManager.delegate = self 

     guard let lat = locationManager.location?.coordinate.latitude else {return} 
     guard let lng = locationManager.location?.coordinate.longitude else {return} 

     mapView.settings.compassButton = true 
     mapView.settings.myLocationButton = true 
     mapView.isMyLocationEnabled = true 

     let camera = GMSCameraPosition.camera(withLatitude: lat, longitude: lng, zoom: 1)    
     mapView.camera = camera    
     mapView.delegate = self 
      getData() 
    } 

    extension MapController: CLLocationManagerDelegate { 

     func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

      guard let location: CLLocation = locations.last else {return}  
      let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 1) 

      mapView.animate(to: camera)  
     } 
} 
+0

Vous voudrez peut-être voir les commentaires sur la réponse ... – Honey

Répondre

1

Pourquoi demandez-vous l'autorisation de deux choses différentes? Si vous demandez et obtenez toujours l'autorisation, vous n'avez pas besoin de demander l'autorisation d'utilisation, puisqu'il s'agit seulement d'un sous-ensemble de l'autorisation permanente. De plus, ce sont deux fonctions asynchrones, donc vous ne pouvez pas exécuter le code basé sur la localisation juste après, puisque si vous n'avez pas encore d'autorisation, le code juste après requestAuthorization() sera exécuté avant que vous ayez réellement l'autorisation et donc les fonctions ne sera pas appelé, puisque vous n'avez pas encore d'autorisation.

Vous devez vérifier le statut d'autorisation avant d'appeler un code lié à l'emplacement, tel que locationManager.startUpdatingLocation() et exécuter uniquement le code lié à l'emplacement si le statut est autorisé. Si ce n'est pas autorisé, vous devez implémenter la fonction locationManager(_:didChangeAuthorization:) de CLLocationManagerDelegate et appeler l'appel lié à l'emplacement à l'intérieur de cette fonction après avoir vérifié que le résultat du changement est un statut autorisé.

+1

C'est ce que je ne comprends pas vraiment. Si l'autorisation de la requête est asynchrone alors pourquoi le reste de viewDidLoad n'est-il pas en cours d'exécution? Aussi, s'il est asynchrone, la ligne suivante, location.startUpdatingLocation(), ne devrait-elle pas exécuter anywawy? Et pouvez-vous expliquer pourquoi dans mon exemple pourquoi le gestionnaire locationManager didUpdateLocations a été appelé de toute façon même si je n'avais pas startUpdatingLocations()? Enfin, s'il existe une fonction déléguée didChangeAuthorization, pourquoi tout le code de cette fonction n'attend-il pas un changement d'autorisation? Merci. – Mike

+0

Comme je l'ai dit, il n'est pas en cours d'exécution, car vous ne pouvez pas appeler des fonctions basées sur l'emplacement tant que le statut d'autorisation n'est pas défini. Si 'startUpdatingLocations' n'est jamais appelé, alors la fonction delegate ne peut pas être appelée, donc' startUpdatingLocations' doit être appelé dans votre code si le délégué est appelé. 'didChangeAuthorization' n'est pertinent que la première fois que votre application est démarrée ou si l'utilisateur modifie le statut de l'autorisation dans les paramètres, sinon cette fonction ne sera plus appelée. –

+0

ma configuration est quelque chose comme 'manager.requestAlwaysAuthorization() manager.startUpdatingLocation()' voulez-vous dire jusqu'à ce que je ne clique pas sur le 'Autoriser' ... Je ne recevrai pas de mises à jour, mais après avoir cliqué je voudrais obtenir mises à jour OU vous voulez dire parce que 'startUpdatingLocation' est évalué immédiatement à un moment où nous n'avons pas encore cliqué sur le permis mais il échouerait complètement en silence? – Honey