2017-01-15 7 views
1

Я пытаюсь получить обновления местоположения, пока мое приложение приостановлено - согласно документации, которую я прочитал, это не должно быть проблемой, и я я выполняю все необходимые шаги, но как только приложение приостановлено, обновления местоположения, похоже, не происходят.Делегат CLLocationManager не получает обновления местоположения после приостановки приложения, несмотря на то, что обновления фонового местоположения включены.

Я видел похожие сообщения, в которых есть решения, связанные с использованием startMonitoringSignificantLocationChanges, но, согласно моему пониманию документации, мне не нужно реализовывать это поверх startUpdatingLocation.

В соответствии с документацией, если включены обновления фонового местоположения, система будет приостановлена, но будет пробуждена при появлении новых данных о местоположении.

Поскольку документация состояния «В случае подвешенного приложения, система пробуждается приложением, обеспечивает обновление делегату менеджера РАСПОЛОЖЕНИЯ в» Я ожидаю, что я могу обработать место обновляет то же самое, если приложение на переднем плане или в фоновом режиме.

У меня есть обновления местоположения, выбранные на вкладке «Возможности», а в файле info.plist ключ UIBackgroundModes включает в себя местоположение в массиве значений.

Что мне не хватает?

Для справки, вот как я объявляю свой CLLocationManager.

lazy var locationManager: CLLocationManager = { 
    let locationManager = CLLocationManager() 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.delegate = self 
    locationManager.activityType = .fitness 
    locationManager.requestAlwaysAuthorization() 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.allowsBackgroundLocationUpdates = true 
    locationManager.pausesLocationUpdatesAutomatically = true 
    return locationManager 
}() 

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1

«Включить поддержку определения местоположения из раздела режимов Фоновых вкладок возможностей в вашем Xcode проекте. (Вы также можете включить эту поддержку, в том числе и ключ UIBackgroundModes со значением местоположения в вашем файл Info.plist приложения.) Включение этого режима не препятствует приостановке работы системы, но она сообщает системе, что она должна пробуждать приложение, когда есть новые данные о местоположении для доставки. Таким образом, этот ключ эффективно позволяет приложению запускать в фоновом режиме для обработки обновлений местоположения всякий раз, когда они происходят ».

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

«Система обеспечивает обновление местоположения на фон местоположения приложений, когда приложение находится на переднем плане, работает в фоновом режиме, или приостановлено. В случае подвесного приложения, система пробуждается приложение доставляет обновление делегату менеджера местоположения, а затем возвращает приложение в приостановленное состояние как можно скорее ».

ответ

1

У меня была та же проблема, и единственный способ предотвратить приложение от неоспоримым приостановлено было установлено

locationManager.pausesLocationUpdatesAutomatically = false 

Когда pausesLocationUpdatesAutomatically установлен в true систем помещает приложение в подвешенном состоянии и не получит местоположения больше, пока пользователь вручную не вернет приложение на передний план.