Проблема с разрешением на размещение iOS 11 и iOS 10
у меня возникла проблема при запросе разрешений местоположения от пользователя, когда я использую iOS11 my 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>
у меня есть две карты, одна для клиента, а другая для сотрудников. Для сотрудников мне нужно знать их местоположение, даже если приложение не работает или имеет backgrounded (они могут отключить его при выходе) и запросить разрешение с помощью
locationManager.requestAlwaysAuthorization()
для клиента мне нужны только места, пока приложение используется и запрашивает разрешение с помощью
locationManager.requestWhenInUseAuthorization()
в iOS 11 это только запрашивает разрешение при использовании и никогда не всегда на разрешение.
в iOS 10 он имеет правильное поведение.
поведение я хочу следующим образом: Когда они являются клиентом (не вошли в систему), он запрашивает только разрешение на использование. Если они входят в систему (сотрудник), он запрашивает местоположение, даже если он не используется.
если кто-то может пролить свет на то, что я пропустил / сделал неправильно буду очень признателен.
что-то отметить, если я удалю разрешение NSLocationAlwaysUsageDescription
iOS10 и iOS11 имеют ту же проблему не запрашивать всегда разрешение.
немного больше разъяснений.
Я реализовал функцию делегата didchangeauthorization, и она вызывается, когда пользователи разрешают разрешение от alert от вызова requestWhenInUseAuthorization()
однако, когда я звоню requestWhenInUseAuthorization()
function on location manager метод делегата не вызывается, это похоже на то, что он никогда не получает этот вызов и диалоговое окно предупреждения не отображается пользователю.
3 ответов
я понял проблему, создав быстрое автономное приложение, которое запрашивало только разрешения, мне дали журнал ошибок, в котором говорилось, что ключи, которые я использовал, были неправильными.
Я NSLocationAlwaysAndWhenInUsageDescription
вместо NSLocationAlwaysAndWhenInUseUsageDescription
что странно, потому что от docs в нем говорится, что NSLocationAlwaysAndWhenInUsageDescription
должен быть использован. Переключение, чтобы включить правильный ключ Исправлена проблема, и теперь разрешения работает, как ожидалось для iOS 11 и 10.
Спасибо за помощь.
В вашей информации.plist Файл Добавить это:
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
Теперь в вашем swift-файле не забудьте добавить делегат:CLLocationManagerDelegate
в viewDiDLoad () добавьте следующее:
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.")
}
}
для обоих случаев, клиентов и сотрудников, вам сначала нужно позвонить locationManager.requestWhenInUseAuthorization()
затем, только если они являются сотрудниками, добавьте вызов
locationManager.requestAlwaysAuthorization()
обзор чтобы настроить авторизацию всегда для служб определения местоположения, выполните следующее: добавьте ключ NSLocationWhenInUseUsageDescription и Nslocationalwaysandwheninusagedescription ключ к вашей информации.plist файл. (Xcode отображает эти ключи как " конфиденциальность-местоположение при использовании Описание " и " конфиденциальность-местоположение всегда и при использовании Описание " в информации.plist в Редакторе.) Если ваше приложение поддерживает iOS 10 и ранее добавьте ключ NSLocationAlwaysUsageDescription в свой Информация.plist файл. (Xcode отображает этот ключ как " конфиденциальность-местоположение Всегда описание использования " в информации.plist в Редакторе.) Создавать и настройте объект CLLocationManager. Звоните requestWhenInUseAuthorization () первоначально, чтобы включить базовое приложение поддержка местоположения. Вызовите только метод requestAlwaysAuthorization () при использовании служб, требующих такого уровня авторизации.