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