Обновления местоположения не доставляются на устройство, пока приложение находится в фоновом режиме

Я работаю над приложением, которое должно иметь возможность собирать данные о местоположении, пока приложение находится в фоновом режиме.

Чтобы разрешить это, я сделал следующее:

  • В настройках проекта на вкладке Capabilities я поставил галочку Location updates. введите здесь описание изображения

  • Я установил ключ NSLocationAlwaysUsageDescription в приложениях Info.plist и присвоил соответствующее строковое значение.

  • I have configured an instance of CLLocationManager like so:
    • locationManager.activityType = .Fitness
    • locationManager.desiredAccuracy = kCLLocationAccuracyBest
    • locationManager.pausesLocationUpdatesAutomatically = false
  • Перед началом сбора данных о местоположении я вызываю locationManager.requestAlwaysAuthorization(), у меня есть соответствующие обратные вызовы делегатов для обработки любой ошибки.
  • наконец, я звоню locationManager.startUpdatingLocation()

При запуске приложения на симуляторе я получаю распечатку обновлений местоположения, и значок приложения также обновляется с количеством собранных местоположений, но при запуске приложений на реальном устройстве после отправки приложения в фоновом режиме приложение вскоре прекращает обработку обновлений местоположения (я знаю это, поскольку значок перестает обновляться).

Мне не хватает какой-то конкретной конфигурации устройства?


person Gabor    schedule 07.09.2015    source источник
comment
У меня была такая же проблема некоторое время, и в моем случае это было из-за этого, в основном переменная allowsBackgroundLocationUpdates имеет значение false по умолчанию в iOS 9. Надеюсь, это поможет.   -  person ujell    schedule 09.10.2015
comment
@ujell спасибо! это решило проблему!   -  person Gabor    schedule 10.10.2015


Ответы (2)


Вот моя настройка, которая работает нормально, когда приложение находится в фоновом режиме или устройство находится в режиме ожидания:

    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.pausesLocationUpdatesAutomatically = false
    locationManager.activityType = .Other
    locationManager.startUpdatingLocation()

Я также использую отложенные обновления местоположения. В didUpdateLocations:

if CLLocationManager.deferredLocationUpdatesAvailable() && deferringUpdates == false {
            locationManager.allowDeferredLocationUpdatesUntilTraveled(CLLocationDistanceMax, timeout: deferredLocationTimeout)
            deferringUpdates = true
} 

и в didFinishDeferredUpdatesWithError:

deferringUpdates = false
person MirekE    schedule 08.09.2015
comment
Спасибо @MirekE, но я не хочу откладывать обновления местоположения. Я хочу обрабатывать их в фоновом режиме по мере их поступления. - person Gabor; 08.09.2015

В iOS 9 настройки возможностей недостаточно. Вам также необходимо установить locationManager.allowsBackgroundLocationUpdates = true в диспетчере местоположений, прежде чем ОС сможет доставлять вам обновления в фоновом режиме. Согласно документации, это обязательно. По умолчанию установлено значение false. См. здесь.

person zakishaheen    schedule 11.08.2016