Чтобы запросить разрешение на месте службы, которые вы используете:
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() {
//when status is not determined this method runs to request location access
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
//have accuracy set to best for navigation - accuracy is not guaranteed it 'does it's best'
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
//find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy -
locationManager.requestLocation()
} else {
//show alert for no location permission
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Здесь делегат:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Yup! Благодаря! Моя проблема была, что я пытался позвонить locatoinServicesEnabled на мой менеджер, то есть 'manager.locationServicesEnabled()' вместо 'CLLocationManager.loationServicesEnabled()' Решено! –
Я понимаю, что ваш код - всего лишь пример, но он немного вводит в заблуждение ... Я думаю, что лучше, если 'authorizationStatus' * установлен * на' notDetermined', вместо того, чтобы просто регистрировать, было бы лучше запросить пользователя «Разрешить/Do not Allow " – Honey
@ Хоуни, конечно, вы, конечно, можете использовать его, как хотите, и, как вы сказали, код является просто примером, чтобы показать, как он может быть использован. –