Непрерывное обновление местоположения фона iOS13 - PullRequest
1 голос
/ 09 октября 2019

В настоящее время я тестирую фоновый режим определения местоположения в iOS 13, так как я хочу отслеживать местоположение пользователя и движение (используя CMMotionManager) в фоновом режиме. Поэтому у меня есть свой собственный (синглтон) класс, который обрабатывает отслеживание местоположения. Я инициализирую CLLocationManager следующим образом:

    func initializeLocationManager() -> CLLocationManager {
        let manager = locationManager ?? CLLocationManager()
        manager.delegate = self
        manager.requestAlwaysAuthorization()
        manager.allowsBackgroundLocationUpdates = true
        manager.pausesLocationUpdatesAutomatically = false
        manager.distanceFilter = kCLDistanceFilterNone
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.activityType = .other
        return manager
    }

Затем запускаю следующие сервисы:

   func startLocationServices() {
        // ...
        locationManager.startUpdatingLocation()
        locationManager.startMonitoringVisits()
        locationManager.startMonitoringSignificantLocationChanges()
        // ...
    }

Кроме того, я реализовал методы CLLocationManagerDelegate (didChangeAuthorization (), didUpdateLocation ()).

В файле info.plist я добавил следующие записи:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array> 

В моем ViewController я вызываю startLocationServices. В настоящее время я установил авторизацию приложения для отслеживания данных о местоположении как ".authorizedAlways"

Обновления местоположения прекращаются примерно через 60 - 130 минут.

Чтобы решить эту проблему, я уже добавил функцию didFinishLaunchingWithOptions, которая снова запускает обновления местоположения:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let launchOptions = launchOptions,
        let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
        isLocationKey {
        restartServices()

    }
    return true
} 

Когда приложение просыпается с помощью этой функции, мне удается получить непрерывныйданные о некоторых тестах, но иногда приложение снова приостанавливалось через несколько минут.

Наконец, я также пробовал таймер, который перезапускает отслеживание местоположения каждые 5 минут, но это, похоже, не влияет на продолжительность обновлениявообще.

Итак, мой вопрос: есть ли способ непрерывного получения обновлений местоположения в фоновом режиме или есть какой-то параметр, который мне не хватает?

Заранее спасибо.

Редактировать: я тестировал приложение на iOS 12, и оно получало постоянные обновления в 5/5 тестах. Так что я думаю, что проблема связана с iOS 13.

1 Ответ

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

С кодом все в порядке! Я столкнулся с той же проблемой, и после исследования я обнаружил, что

В основном докладе WWDC19 Apple объявила о двух изменениях в том, как разрешения местоположения будут работать в iOS 13. Первое изменение дает пользователям возможность поделиться своим местоположением сваше приложение только один раз. Это упрощает опробование функций определения местоположения и помогает пользователям сохранять конфиденциальные данные о местоположении.

Первое заметное изменение заключается в том, что даже при вызове requestAlwaysAuthorization пользователь получит только «сейчас» и «когда используется 'опции в диалоге разрешений. Если пользователь предоставляет вам разрешение «при использовании» и вы пытаетесь выполнить поиск местоположения в фоновом режиме, только тогда пользователю будет предложено диалоговое окно, чтобы предоставить фоновое разрешение.

Итак, когда пользователь предоставляет Разрешение WhenInUseUsage Вы получите always в CLAuthorizationStatus, а если пользователь выберет Allow Once CLAuthorizationStatus, то при следующем запуске приложения будет notDetermined

Подробную информацию можно найти в этой статье. https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889

А вот и видео https://developer.apple.com/videos/play/wwdc2019/705/

РЕДАКТИРОВАТЬ

После того, как In In User разрешение, предоставленное пользователем iOS, покажет пользователю другоедиалог через несколько дней, чтобы изменить разрешение с момента использования, чтобы всегда разрешать.

Так что теперь нет способа напрямую попросить пользователя всегда разрешать разрешение немедленно, как мы делали раньше

enter image description here

...