2015-05-07 6 views
19

Ich habe einen View-Controller, der die CLLocationManagerDelegate implementiert. Ich erstelle ein die CLLocationManager Variable:Swift LocationManager didChangeAuthorizationStatus Immer aufgerufen

let locationManager = CLLocationManager() 

Dann in der viewDidLoad, habe ich Eigenschaften:

// Set location manager properties 
locationManager.delegate = self 
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters 
locationManager.distanceFilter = 50 

Das Problem kommt, dass die Funktion auch aufgerufen wird, bevor ich den Berechtigungsstatus überprüfen.

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if (status == .AuthorizedWhenInUse) { 
     // User has granted autorization to location, get location 
     locationManager.startUpdatingLocation() 
    } 
} 

Kann mir jemand mitteilen, was dazu führen könnte?

Antwort

39

- locationManager:didChangeAuthorizationStatus: wird aufgerufen, kurz nachdem die CLLocationManager initialisiert wird.

Sie können Ermächtigungs innerhalb des Delegatmethode beantragen, wenn Sie wollen:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     locationManager.requestAlwaysAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     locationManager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     locationManager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

Beachten Sie, dass Sie die Delegierten in einer ‚rechtzeitige‘ Materie zuweisen müssen, wenn Sie diese arbeiten möchten.

Wenn Sie die Delegiertenzuweisung irgendwie verzögern würden, z. Wenn Sie es asynchron einstellen, verpassen Sie möglicherweise den ersten Aufruf an - locationManager:didChangeAuthorizationStatus:.

+1

Thank you very much. Ich habe nicht bemerkt, dass es nach der Initialisierung aufgerufen wird. –

+0

Danke für die Antwort. Die Apple-Dokumentation muss mit diesen Informationen aktualisiert werden. –

+0

Es scheint, dass Sie recht haben, dass 'didChangeAuthorizationStatus' aufgerufen wurde, kurz nachdem' CLLocationManager' initialisiert wurde, aber wo ist das dokumentiert? – bobics

5

Swift 3

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
     switch status { 
     case .notDetermined: 
      manager.requestAlwaysAuthorization() 
      break 
     case .authorizedWhenInUse: 
      manager.startUpdatingLocation() 
      break 
     case .authorizedAlways: 
      manager.startUpdatingLocation() 
      break 
     case .restricted: 
      // restricted by e.g. parental controls. User can't enable Location Services 
      break 
     case .denied: 
      // user denied your app access to Location Services, but can grant access from Settings.app 
      break 
     } 
    } 
+0

Warum heißt es "ungültig redeclaration von 'locationManager (_: didChangeAuthorization :)' "Wenn ich versuche, die obige Methode locationManager (_: didChangeAuthorization :) in swift 4 zu implementieren. – madu