Разрешение разрешения на размещение 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() когда вы используете службы, требующие такого уровня авторизации.