Разрешение разрешения на размещение iOS 11 и iOS 10
У меня возникла проблема при запросе разрешений на доступ от пользователя, когда я использую iOS11, мой info.plist содержит
<key>NSLocationWhenInUseUsageDescription</key>
<string>When in use permissions</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>always permissions</string>
<key>NSLocationAlwaysAndWhenInUsageDescription</key>
<string>Always and in usage permissions</string>
У меня есть две карты для клиента, а другая для сотрудников. Для сотрудников мне нужно знать их местоположение, даже если приложение не работает или не зашифровано (они могут отключить его при выходе) и запросить разрешение, используя
locationManager.requestAlwaysAuthorization()
Для клиента мне нужны только местоположения, пока приложение используется, и запрашивайте разрешение, используя
locationManager.requestWhenInUseAuthorization()
В iOS 11 это запрашивает разрешение только при использовании и никогда не разрешается всегда.
В iOS 10 он имеет правильное поведение.
Поведение, которое я хочу, выглядит следующим образом:
Когда они являются клиентом (не подписываются), он запрашивает только при использовании разрешения. Если они подписывают (сотрудник), он запрашивает местоположение, даже если он не используется.
Если кто-то может пролить свет на то, что я пропустил/сделал неправильно, это было бы очень признательно.
Что-то примечание, если я удалю разрешение NSLocationAlwaysUsageDescription
iOS10 и iOS11 имеют ту же проблему, что и не запрашивать всегда разрешение.
Немного больше разъяснений.
Я реализовал функцию делегирования didChangeAuthorization, и он вызывается, когда пользователи разрешают разрешение извещения называть requestWhenInUseAuthorization()
однако, когда я вызываю функцию requestWhenInUseAuthorization()
в диспетчере местоположений, метод делегата не вызывается, это похоже на то, что он никогда не получает этот вызов, и пользователю не отображается диалоговое окно предупреждения.
Ответы
Ответ 1
Я понял проблему, создав быстрое автономное приложение, которое запрашивало только разрешения, мне был предоставлен журнал ошибок, в котором указано, что используемые мной ключи были неправильными.
У меня был NSLocationAlwaysAndWhenInUsageDescription
вместо NSLocationAlwaysAndWhenInUseUsageDescription
, который является нечетным, потому что из docs в нем указано, что следует использовать NSLocationAlwaysAndWhenInUsageDescription
. Переключение на включение исправленной ключевой проблемы, и теперь разрешения работают как ожидалось для iOS 11 и 10.
Спасибо за помощь.
Ответ 2
В файле info.plist добавьте следующее:
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
Теперь в вашем быстром файле не забудьте добавить делегат: CLLocationManagerDelegate
В вашем представленииDiDLoad() добавьте следующее:
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
locationManager.startMonitoringSignificantLocationChanges()
// Here you can check whether you have allowed the permission or not.
if CLLocationManager.locationServicesEnabled()
{
switch(CLLocationManager.authorizationStatus())
{
case .authorizedAlways, .authorizedWhenInUse:
print("Authorize.")
break
case .notDetermined:
print("Not determined.")
break
case .restricted:
print("Restricted.")
break
case .denied:
print("Denied.")
}
}
Ответ 3
Для обоих случаев, клиентов и сотрудников, сначала нужно вызвать locationManager.requestWhenInUseAuthorization()
Затем, только если они являются сотрудниками, добавьте вызов
locationManager.requestAlwaysAuthorization()
См. https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization
Обзор. Чтобы всегда настроить авторизацию для служб определения местоположения, выполните следующее: Добавьте ключ NSLocationWhenInUseUsageDescription и NSLocationAlwaysAndWhenInUsageDescription ключ к вашему файлу Info.plist. (Xcode отображает эти ключи как "Конфиденциальность - местоположение при использовании использования Описание" и "Конфиденциальность - Местоположение всегда и когда используется Использование Описание" в редакторе Info.plist.) Если ваше приложение поддерживает iOS 10 и ранее, добавьте ключ NSLocationAlwaysUsageDescription к вашему Файл Info.plist. (Xcode отображает этот ключ как "Конфиденциальность - местоположение Always Usage Description" в редакторе Info.plist.) Создайте и настройте объект CLLocationManager. Позвоните requestWhenInUseAuthorization() сначала для включения основного приложения поддержка местоположения. Вызовите метод requestAlwaysAuthorization() когда вы используете службы, требующие такого уровня авторизации.