В настоящее время я тестирую фоновый режим определения местоположения в 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.