Проблема с разрешением на размещение 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()

см https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization

обзор чтобы настроить авторизацию всегда для служб определения местоположения, выполните следующее: добавьте ключ NSLocationWhenInUseUsageDescription и Nslocationalwaysandwheninusagedescription ключ к вашей информации.plist файл. (Xcode отображает эти ключи как " конфиденциальность-местоположение при использовании Описание " и " конфиденциальность-местоположение всегда и при использовании Описание " в информации.plist в Редакторе.) Если ваше приложение поддерживает iOS 10 и ранее добавьте ключ NSLocationAlwaysUsageDescription в свой Информация.plist файл. (Xcode отображает этот ключ как " конфиденциальность-местоположение Всегда описание использования " в информации.plist в Редакторе.) Создавать и настройте объект CLLocationManager. Звоните requestWhenInUseAuthorization () первоначально, чтобы включить базовое приложение поддержка местоположения. Вызовите только метод requestAlwaysAuthorization () при использовании служб, требующих такого уровня авторизации.