Per chiedere l'autorizzazione per i servizi di localizzazione che utilizzi:
yourSharedLocationManager.requestWhenInUseAuthorization()
Se lo stato è attualmente indeterminato, verrà visualizzato un avviso che richiede all'utente di consentire l'accesso. Se l'accesso viene negato, la tua app verrà notificata in CLLocationManagerDelegate, allo stesso modo se l'autorizzazione viene negata in qualsiasi momento sarai aggiornato qui.
Ci sono due stati separati che devi controllare per determinare le autorizzazioni correnti.
- Se l'utente ha i servizi di localizzazione generali abilitati o meno
CLLocationManager.locationServicesEnabled()
- Se l'utente ha concesso l'autorizzazione corretta per la tua app ..
CLLocationManager.authorizationStatus() == .authorizedWhenInUse
Potresti aggiungere un'estensione è un'opzione utile:
extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
return CLLocationManager.locationServicesEnabled() &&
(CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}
}
Qui si accede quando l'utente ha prima richiesto le indicazioni:
private func requestUserLocation() {
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestLocation()
} else {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Ecco il delegato:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
manager.locationServicesEnabled()
piuttosto cheCLLocationManager.loationServicesEnabled()
Risolto!