2010-08-06 2 views
105

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

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

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

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

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

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

Однако этот пункт на Significant Change Service в Location Awareness Programming Guide имеет сказать следующее:

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

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

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

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

ответ

78

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

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

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground 

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

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

+1

Вычеркнуто №6 в моем ответе, чтобы не путать людей. – Aaron

+0

Ах круто ... Спасибо @Tegeril :) – RedBlueThing

+0

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

24

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

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

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) 
    

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

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

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

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

Удачи!

+1

@Tegeril +1 Спасибо за ответ. Я начал слышать сверчки на этом. :) Я удивлен, что приложения начали от приостановки, чтобы перезапустить startMonitoringSignificantLocationChanges. У вас есть ссылка на doco, где это описано? Мое понимание заключалось в том, что загрузка из приостановленного состояния будет создавать все ваши объекты так же, как и когда приложение было приостановлено. Поэтому я ожидаю, что существенный запрос на изменение будет действовать. – RedBlueThing

+0

Возможно, вы говорите об этом? «При повторном запуске вы все равно должны сконфигурировать объект менеджера местоположений и вызвать этот метод для продолжения приема событий местоположения». Но я думаю, что это относится к случаю, когда приложение запускалось из состояния завершения (по событию местоположения). Это, в основном, корень моего вопроса: «что происходит для приостановленного случая?». – RedBlueThing

+0

Morgan Grainger на форумах Dev предложил следующее: «Вам нужно создать CLLocationManager, установить делегат и вызвать startMonitoringSignificantLocationChanges при запуске приложения, иначе Core Location не сможет доставлять обновления». в контексте перезапуска приложения независимо от приостановленного или приостановленного состояния. От "приложение было перезапущено после startMonitoringSignificantLocationChanges и теперь что?" – Aaron

1

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

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

Смежные вопросы