2015-05-07 15 views
19

Ho un controller di visualizzazione che implementa lo CLLocationManagerDelegate. Creo una variabile CLLocationManager:Swift LocationManager didChangeAuthorizationStatus Sempre chiamato

let locationManager = CLLocationManager() 

Poi nel viewDidLoad, ho impostato le proprietà:

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

Il problema arriva che la funzione viene chiamata anche prima di controllare lo stato di autorizzazione.

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

Qualcuno può informarmi che cosa potrebbe causare questo a verificarsi?

risposta

39

- locationManager:didChangeAuthorizationStatus: viene chiamato poco dopo l'inizializzazione dello CLLocationManager.

È possibile richiedere l'autorizzazione all'interno del metodo delegato se si desidera:

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 
    } 
} 

essere consapevoli del fatto che è necessario assegnare il delegato in una questione 'tempestivo' se si vuole far funzionare tutto questo.

Se si ritarda in qualche modo l'assegnazione del delegato, ad es. impostandolo in modo asincrono, potresti perdere la chiamata iniziale a - locationManager:didChangeAuthorizationStatus:.

+1

La ringrazio molto. Non ho realizzato che venga chiamato dopo l'inizializzazione. –

+0

Grazie per la risposta. La documentazione Apple deve essere aggiornata con queste informazioni. –

+0

Sembra che tu abbia ragione che 'doneChangeAuthorizationStatus' ha chiamato poco dopo che' CLLocationManager' è stato inizializzato, ma dove è documentato? – 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

Perché dice "non valido redeclaration di 'locationManager (_: didChangeAuthorization :)' "Quando tento di implementare il metodo locationManager (_: didChangeAuthorization :) sopra in swift 4. – madu

Problemi correlati