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