2017-03-04 1 views
0

J'ai un bouton qui utilise l'emplacement de l'utilisateur pour rechercher autour d'eux. Si elles n'ont pas accordé/refusé la permission d'utiliser leur emplacement encore, il demande l'autorisationApp se bloque lors de la demande de localisation et l'utilisateur ne fait rien

Code pertinent:

func updateLocationStatus(){ 
    locationEnabled = CLLocationManager.locationServicesEnabled() 
    appLocationEnabled = CLLocationManager.authorizationStatus() 
} 

@IBAction func searchNearby(sender: UIButton) { 
    updateLocationStatus() 
    if appLocationEnabled == CLAuthorizationStatus.Denied { 
     //Show an alert to let them know they've denied location permissions 
     presentViewController(alert, animated: true, completion: nil) 
    } 
    else if appLocationEnabled == CLAuthorizationStatus.NotDetermined || 
     appLocationEnabled != CLAuthorizationStatus.AuthorizedWhenInUse && 
     appLocationEnabled != CLAuthorizationStatus.AuthorizedAlways{ 
     locationManager.requestWhenInUseAuthorization() 
    } 
    else{ 
     activityIndicator.startAnimating() 
     locationManager.requestLocation() 
    } 
} 

Il fonctionne très bien quand il est utilisé normalement. Toutefois, si vous laissez l'alerte "Autoriser l'application à utiliser votre emplacement [Ne pas autoriser] [Autoriser]" à rester là pendant environ 5 secondes, l'application se bloque. La ligne a sauté à l'Xcode origine de l'erreur est

locationManager.requestWhenInUseAuthorization() 

et l'erreur fournie est

Fil 1: EXC_BAD_ACCESS (code = 2, adresse = 0xsomeaddress)

J » t même savoir où commencer à résoudre ce problème parce que l'erreur ne me dit rien et la fonctionnalité fonctionne parfaitement bien, sauf lorsque vous ne faites rien trop longtemps

+0

Le backtrace fournit-il des informations utiles? –

+0

Oui, c'est vraiment le cas. Il s'avère que depuis que j'appelle cette fonction tant que l'autorisation n'est pas déterminée, la fonction searchNearby est appelée à plusieurs reprises lorsque la boîte de dialogue apparaît jusqu'à ce qu'un débordement de pile se produise. Je pensais que les instructions se dérouleraient séquentiellement (ie l'exécution du code s'arrête sur requestAuthorization jusqu'à ce qu'une réponse soit déterminée) mais il semble que ce ne soit pas le cas. Merci pour votre suggestion, je n'ai jamais su que backtrace était une chose dans xcode. S'il vous plaît répondez comme une réponse afin que je puisse l'accepter –

Répondre

1

Le backtrace fournit-il des informations utiles? Dans la console, vous pouvez taper bt à l'invite lorsque Xcode se brise. Alternativement, vous pouvez jeter un coup d'œil au navigateur de débogage.

1

Peut-être cela wi Je vais résoudre cette question. Assurez-vous d'ajouter la combinaison clé-valeur appropriée dans votre Info.plist.

Un peu comme ceci:

enter image description here

vous pouvez également définir un point de pause pour vous assurer que l'emplacement a été activé définitivement.

Pour commencer à trouver l'emplacement, vous devez également configurer les desiredAccuracy et distanceFilter propriétés du gestionnaire d'emplacement, puis appelez le requestLocation() ou startUpdatingLocation().

+0

J'ai la vie privée - Location Description Localisation et NSLocationWhenInUseUsageDescription chaînes définies dans mon Info.plist. Je ne demande jamais l'utilisation Toujours donc je n'ai pas cette description –