Aby poprosić o pozwolenie na korzystanie z usług lokalizacyjnych, z których korzystasz:
yourSharedLocationManager.requestWhenInUseAuthorization()
Jeśli stan jest obecnie nieokreślony, pojawi się alert z monitem o zezwolenie na dostęp. W przypadku odmowy dostępu Twoja aplikacja zostanie powiadomiona w CLLocationManagerDelegate, podobnie jak w przypadku odmowy pozwolenia w dowolnym momencie zostaniesz zaktualizowany tutaj.
Istnieją dwa odrębne stany, które należy sprawdzić, aby określić bieżące uprawnienia.
- Czy użytkownik ma włączone ogólne usługi lokalizacyjne, czy nie
CLLocationManager.locationServicesEnabled()
- Jeśli użytkownik udzielił odpowiednich uprawnień Twojej aplikacji ...
CLLocationManager.authorizationStatus() == .authorizedWhenInUse
Możesz dodać rozszerzenie to przydatna opcja:
extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
return CLLocationManager.locationServicesEnabled() &&
(CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}
}
Tutaj jest dostępny, gdy użytkownik najpierw poprosił o wskazówki:
private func requestUserLocation() {
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestLocation()
} else {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Oto delegat:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
manager.locationServicesEnabled()
ZamiastCLLocationManager.loationServicesEnabled()
Solved!