Поведение для существенного изменения местоположения API, когда прекращено /приостановлено?

Это раздел из CLLocationManager документация, описывающая поведение приложения с помощью startMonitoringSignificantLocationChanges :

  

Если вы запустите эту услугу и ваш   заявка впоследствии   прекращено, система автоматически   перезапускает приложение в   фон, если новое событие прибывает. В   такой случай, словарь опций   перешел к   применение: didFinishLaunchingWithOptions:   метод вашего приложения делегата   содержит ключ   UIApplicationLaunchOptionsLocationKey   указать, что ваша заявка была   запущен из-за события местоположения.   При повторном запуске вы должны еще   настроить объект диспетчера местоположения   и вызвать этот метод, чтобы продолжить   получение места событий. Когда ты   перезапустить службы определения местоположения, текущий   событие доставлено вашему делегату   немедленно. Кроме того, местоположение   собственность вашего менеджера   Объект заселен наиболее   недавнее местоположение объекта еще до вас   запускать службы определения местоположения.

Итак, я понимаю, что если ваше приложение завершает работу (и я предполагаю, что если вы не вызовете stopMonitoringSignificantLocationChanges из applicationWillTerminate ) вас разбудит UIApplicationLaunchOptionsLocationKey application: didFinishLaunchingWithOptions . На этом этапе вы создаете свой CLLocationManager Вызовите startMonitoringSignificantLocationChanges и выполните фоновую обработку местоположения для ограниченное время . Так что я в порядке с этим битом.

В предыдущем абзаце рассказывается только о том, что происходит, когда приложение закрывается, но не предлагается, что вы делаете, когда приложение приостановлено. Документация для didFinishLaunchingWithOptions говорит:

  

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

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

Однако этот абзац в Служба значительных изменений в Руководство по программированию осведомленности о местоположении содержит следующееговорят:

  

Если вы оставите этот сервис запущенным и   ваша заявка впоследствии   приостановлено или прекращено, услуга   автоматически просыпается   приложение, когда новые данные о местоположении   прибывает. Во время пробуждения ваш   приложение ставится в фоновом режиме   и уделить немного времени   обработать данные о местоположении. Так как   ваше приложение в фоновом режиме,   это должно делать минимальную работу и избегать   любые задачи (например, запрос   сеть), которая может помешать этому   возвращение раньше назначенного времени   истекает. Если это не так, ваш   Приложение может быть прекращено.

Это говорит о том, что вы проснулись с данными о местоположении, если ваше приложение было приостановлено, но не упоминает, как вы проснулись:

  • Является ли UIApplicationDelegate получает обратный вызов, сообщающий мне, что я возвращаюсь из приостановленного состояния в фоновое состояние?
  • Менеджер местоположений (который был заморожен при приостановке приложения) начинает получать locationManager: didUpdateToLocation: fromLocation обратные вызовы?
  • Мне просто нужно реализовать код в моем didUpdateToLocation , которое проверяет состояние приложения и выполняет минимальную обработку в фоновом режиме?

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

108 голосов | спросил RedBlueThing 6 AM00000090000004931 2010, 09:37:49

3 ответа


0

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

То есть ваше приостановленное приложение проснулось, вы не получите никаких обратных вызовов от своего делегата приложения, вместо этого вы получите обновления своего местоположения через существующий CLLocationManagerDelegate . Вы можете обнаружить, что вы работаете в фоновом режиме, проверив applicationState , и выполнить ограниченную работу для случая, когда вы проснулись из приостановленного состояния, чтобы выполнить обработку местоположения.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

Я пришел к такому выводу, применив тест для определения местоположения, который можно загрузить

N.B. Пункт шесть в предыдущем ответе неверен. Замораживание приостановленных приложений действительно получает обратные вызовы CLLocationManagerDelegate , когда они просыпаются из приостановленного состояния.

ответил RedBlueThing 14 PM00000060000002531 2010, 18:18:25
0

Я понимаю следующее (я нахожусь в процессе написания приложения, которое использует этот API, но еще не завершило этот компонент, чтобы начать тестирование):

  1. Ваше приложение запускается впервые, вы регистрируетесь в startMonitoringSignificantLocationChanges и предоставляете функцию обратного вызова. Когда ваше приложение работает, оно будет вызывать этот обратный вызов всякий раз, когда оно получает существенное изменение.
  2. Если ваше приложение переведено в фоновый режим, UIApplication получит applicationWillResignActive , а затем applicationDidEnterBackground .
  3. Если ваше приложение будет удалено, пока оно приостановлено в фоновом режиме, вы не будете уведомлены; однако, если ваше приложение будет убито во время его работы (насколько мне известно, передний план или фон), вы получите момент с applicationWillTerminate . Вы не можете запросить дополнительное фоновое время от этой функции.
  4. Несмотря на то, что ОС была убита в фоновом режиме, ОС перезапустит ваше приложение. Если ваше приложение просто запускается операционной системой для внесения изменений, вы получите вызов application didFinishLaunchingWithOptions :

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

    поможет вам определить, вернулись ли вы из фонового изменения местоположения.

  5. Если вместо этого вы в данный момент работаете в фоновом режиме, а ваше приложение вручную перезапускается пользователем, вы получите applicationWillEnterForeground , за которым следует applicationDidBecomeActive .
  6. Независимо от того, как это произошло, когда ваше приложение перезапускается (если только оно не работало в фоновом режиме в результате фоновой задачи и указанная задача не начала отслеживать изменения), вам нужно явно сообщить об этом startMonitoringSignificantLocationChanges еще раз, потому что обратный вызов больше не прикрепляется после «сублимационной сушки». И да, вам просто нужно реализовать код в didUpdateToLocation после того, как вы повторно подключили какой-либо обработчик местоположения, когда возвращаетесь из приостановленного состояния.

Это то, чем я сейчас занимаюсь при разработке кода. Как я упоминал ранее, я не совсем готов протестировать это на устройстве, поэтому не могу сказать, правильно ли я все интерпретировал, поэтому, комментаторы, не стесняйтесь поправлять меня (хотя я много читал о тема).

О, и если по какой-то причине вам не везет, вы выпускаете приложение, которое делает то, что я хочу, я могу заплакать:)

Удачи!

ответил Aaron 10 AM00000080000002831 2010, 08:54:28
0

Если приложение вызвано из приостановленного состояния в результате изменения местоположения, приложение запустится в фоновом состоянии.

Все объекты будут активными, и вы получите обновление местоположения в существующем делегате.

ответил Anshu 27 Jpm1000000pmTue, 27 Jan 2015 13:37:18 +030015 2015, 13:37:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132