Чтобы запросить разрешение на службы определения местоположения, которые вы используете:
yourSharedLocationManager.requestWhenInUseAuthorization()
Если статус в настоящее время не определен, появится предупреждение, предлагающее пользователю разрешить доступ. Если в доступе будет отказано, ваше приложение будет уведомлено в CLLocationManagerDelegate, аналогично, если в разрешении будет отказано в любой момент, вы будете обновлены здесь.
Есть два отдельных статуса, которые необходимо проверить, чтобы определить текущие разрешения.
- Включены ли у пользователя общие службы определения местоположения или нет
CLLocationManager.locationServicesEnabled()
- Если пользователь предоставил правильное разрешение для вашего приложения ..
CLLocationManager.authorizationStatus() == .authorizedWhenInUse
Вы можете добавить расширение - удобный вариант:
extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
return CLLocationManager.locationServicesEnabled() &&
(CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}
}
Здесь к нему обращаются, когда пользователь впервые запросил маршрут:
private func requestUserLocation() {
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestLocation()
} else {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Вот делегат:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
manager.locationServicesEnabled()
вместо того, чтобыCLLocationManager.loationServicesEnabled()
решить!