На каких условиях iOS 13 просит пользователя предоставить доступ к местоположению «Всегда»? - PullRequest
4 голосов
/ 01 октября 2019

Основная функция моего приложения - обновление данных о местоположении в фоновом режиме. В iOS 13, когда мы звоним locationManager.requestAlwaysAuthorization(), система просит пользователя выбрать один из вариантов 'Never', 'Permit Once' и 'When in use'.

screenshot 1

Если пользователь предоставит доступ 'When in use', наше приложение сможет работать только на переднем плане.

Я не могу понять следующее:Иногда, когда приложение переходит в фоновый режим и через некоторое время становится активным и снова переходит в фоновый режим, iOS 13 просит пользователя изменить доступ к местоположению на 'Always'

see screenshot 2

Что должно делать мое приложениесделать чтобы iOS 13 показывал это диалоговое окно пользователю? (Я хочу сделать это, когда мое приложение в первый раз переходит в фоновый режим)

PS Я знаю, что могу использовать какое-то настраиваемое оповещение с текстом типа «пожалуйста, перейдите в настройки системы и настройте доступ к местоположению для этого приложения». в режиме «Всегда». Но мне нужно знать, есть ли способ использовать «системный поток», как описано выше?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Я полагаю, что это новое поведение iOS 13, здесь указано, что

Если ваше приложение запрашивает и получает авторизацию при использовании, вы можете сделать отдельный запрос наВсегда авторизация позже. Тем не менее, приложения могут делать только один запрос на авторизацию Always.

Также для справки вы можете проверить эту тему

1 голос
/ 02 октября 2019

@ Ответ Клаудио помогает мне решить мою проблему. Я обнаружил, что он может получить доступ к местоположению в фоновом режиме, имея разрешение 'When in use'. Для этого необходимо установить locationManager.showsBackgroundLocationIndicator = true.

Вот моя настройка LocationManager:

        let locationManager = CLLocationManager()
        if #available(iOS 9, *){
            locationManager.allowsBackgroundLocationUpdates = true
        }
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
        locationManager.distanceFilter = kCLDistanceFilterNone
        locationManager.headingFilter = kCLHeadingFilterNone
        locationManager.pausesLocationUpdatesAutomatically = true
        locationManager.activityType = .otherNavigation
        if #available(iOS 11.0, *) {
            locationManager.showsBackgroundLocationIndicator = true;
        }
        locationManager.delegate = self
        locationManager.startMonitoringSignificantLocationChanges()
1 голос
/ 01 октября 2019

Это новое поведение iOS 13. Это было реализовано Apple, чтобы дать пользователям больше прозрачности. Для подробного понимания этого изменения вы можете обратиться к этой ссылке

...