Это раздел документации CLLocationManager , описывающий поведение приложения с помощью startMonitoringSignificantLocationChanges :
Если вы запустите эту услугу и ваш
заявка впоследствии
прекращено, система автоматически
перезапускает приложение в
фон, если новое событие прибывает. В
такой случай, словарь опций
перешел к
применение: didFinishLaunchingWithOptions:
метод вашего приложения делегата
содержит ключ
UIApplicationLaunchOptionsLocationKey
указать, что ваша заявка была
запущен из-за события местоположения.
После перезапуска вы должны еще
настроить объект диспетчера местоположения
и вызвать этот метод, чтобы продолжить
получение места событий. Когда ты
перезапустить службы определения местоположения, текущий
событие доставлено вашему делегату
немедленно. Кроме того, расположение
собственность вашего менеджера
Объект заселен наиболее
недавнее местоположение объекта еще до вас
начать локацию услуг.
Так что я понимаю, что если ваше приложение завершает работу (и я предполагаю, что если вы не вызовете stopMonitoringSignificantLocationChanges из applicationWillTerminate ), вы проснетесь с UIApplicationLaunchOptionsLocationKey параметр для приложения: didFinishLaunchingWithOptions . В этот момент вы создаете CLLocationManager , вызываете startMonitoringSignificantLocationChanges и выполняете фоновую обработку местоположения в течение ограниченного времени . Так что я в порядке с этим битом.
В предыдущем параграфе говорится только о том, что происходит, когда приложение завершается, и не предлагается, что вы делаете, когда приложение приостановлено. Документация для didFinishLaunchingWithOptions гласит:
Приложение отслеживает местоположение
обновления в фоновом режиме, был очищен,
и теперь был перезапущен. В этом
случай, словарь содержит ключ
указывая, что заявка была
перезапущен из-за нового местоположения
событие.
Предполагается, что вы будете получать этот вызов только при запуске приложения (из-за изменения местоположения) после того, как вы были прерваны.
Однако параграф Служба значительных изменений в Руководстве по программированию осведомленности о местоположении содержит следующее:
Если вы оставите эту службу запущенной и
ваша заявка впоследствии
приостановлено или прекращено, услуга
автоматически просыпается
приложение, когда новые данные о местоположении
прибывает. Во время пробуждения ваш
приложение ставится в фоновом режиме
и уделить немного времени
обработать данные о местоположении. Так как
ваше приложение в фоновом режиме,
это должно делать минимальную работу и избегать
любые задачи (например, запрос
сеть), которая может помешать этому
возвращение раньше назначенного времени
истекает. Если это не так, ваш
заявка может быть прекращена.
Это говорит о том, что вы проснулись с данными о местоположении, если ваше приложение было приостановлено, но не упоминает, как вы проснулись:
- Получает ли UIApplicationDelegate обратный вызов, сообщающий, что я возвращаюсь из приостановленного состояния в фоновое состояние?
- Менеджер местоположений (который был заморожен при приостановке приложения) начинает получать locationManager: didUpdateToLocation: fromLocation обратные вызовы?
- Нужно ли просто реализовать код в моем сообщении didUpdateToLocation , которое проверяет состояние приложения и выполняет минимальную обработку в фоновом режиме?
В процессе написания этого, я думаю, что я, возможно, только что ответил на свой собственный вопрос, но было бы здорово, чтобы мое понимание этого подтвердилось кем-то более знающим.