Поведение для значительных изменений местоположения API при прекращении / приостановленных?

StackOverflow https://stackoverflow.com/questions/3421242

Вопрос

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

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

Так что мое понимание в том, что если ваше приложение заканчивается (и я предполагаю, что если вы не звоните stopmonitoringsignificantlocationchanges от ApplicationWillterminate) вы будете проснуться с UiagplyationlaunchOptionslocationKey. параметр к Применение: DidfiniShlaunchingWithOptions.. Отказ В этот момент вы создаете свой ClllocationManager, вызов startmonitoringsignificantlocationchanges и сделать вашу предпосылку обработки местоположения для ограниченный срок. Отказ Так что я в порядке с этим битом.

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

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

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

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

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

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

  • Делает UiApplicationDelegate. Получите обратный вызов, рассказывая мне, что я возобновляю из приостановленного состояния в фоновое состояние?
  • Делает ли менеджер местоположения (это замораживание, когда приложение было приостановлено) начать получать locationmanager: Дидупдатетолокация: излома обратные вызовы?
  • Мне просто нужно реализовать код в моем Дидупдатетолокация Сообщение, которое проверяет состояние приложения и делает минимальную обработку, если в фоновом режиме?

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

Это было полезно?

Решение

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

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

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

Я пришел к этому выводу с ремнем теста на местоположение, к которому вы добро пожаловать скачать и попробуйте. Это довольно простое приложение, которое позволяет включить значительные изменения, а GPS изменять API через UI и регистрируйте все ответы, которые вы вернетесь.

Принцип Точка шесть в предыдущем ответе не правильно. Заморозить сушеный Приостановленные приложения получают ClllocationManagerDelegate. Обратные вызовы, когда они проснулись от подвешенного состояния.

Другие советы

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

  1. Ваше приложение работает впервые, вы зарегистрируетесь в startmonitoringsignificantlocationchanges, и предоставьте функцию обратного вызова. Хотя ваше приложение запущено, он позвонит это обратным вызовам, когда он получает значительное изменение.
  2. Если ваше приложение помещено на задний план, Uiacplication получит ApplicationWILLRESignactive., с последующим ApplicationDidenterBackground.
  3. Если ваше заявление будет убито, пока он приостановлен на заднем плане, вы не будете уведомлены; Однако, если ваше приложение будет убито, пока он работает (передний план или фон для моих знаний), вы получите момент с ApplicationWillterminate. Отказ Вы не можете запросить дополнительное текущее время от этой функции.
  4. Несмотря на убийство на заднем плане, ОС отменит ваше приложение. Если ваше приложение просто запущено ОС для изменения, вы получите звонок Приложение DidfiniShlaunchingWithOptions.:

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

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

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

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

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

Удачи!

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top