iOS — CoreLocation и геозона, когда приложение закрыто

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

Например, я понимаю, что когда приложение находится в фоновом режиме, эти сервисы все равно будут сохраняться (если они правильно закодированы), но как быть, когда пользователь дважды нажимает кнопку «Домой» и закрывает приложение? Можно ли получить данные о местоположении?


person Brett    schedule 18.06.2013    source источник
comment
да еще можно получить. Пока приложение продолжает работать в фоновом режиме и при условии, что программист закодировал его таким образом, чтобы отправлять обновления местоположения на ваш сервер.   -  person Srikar Appalaraju    schedule 18.06.2013
comment
Как только вы закроете приложение двойным нажатием на кнопку «Домой», вам не повезло.   -  person ninehundreds    schedule 18.06.2013
comment
На самом деле, вам следует пересмотреть документы. Смотрите мой ответ ниже. stackoverflow.com/a/17174344/662605   -  person Daniel    schedule 18.06.2013


Ответы (4)


Согласно Документация Apple в разделе Использование регионов для мониторинга пересечений границ:

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

Так что да, ваше приложение будет разбужено (или перезапущено!), Когда местоположение системы обнаружит, что вы вошли/вышли (в зависимости от вашей настройки) в желаемый регион, так что это даже если ваше приложение, конечно, не работает. Вам просто нужно правильно обработать его в делегате приложения, когда приложение перезапускается, вы получаете ключ UIApplicationLaunchOptionsLocationKey в словаре параметров. Подробнее см. ссылку на документацию ниже.

Помните, что метод -startMonitoringForRegion:desiredAccuracy: устарел в iOS 6, поэтому его не следует использовать. Вместо этого используйте -startMonitoringForRegion.

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

ОБНОВЛЕНИЕ

Apple обновила документацию CLLocationManager после моего отчета об ошибке. В документации теперь указывается, для каких типов мониторинга местоположения приложение запускается или не запускается после его завершения. См. раздел Использование служб определения местоположения. в фоновом режиме

person Daniel    schedule 18.06.2013
comment
Отличные комментарии! Это именно то, что я не мог найти :-) (Вероятно, искал не в том месте). Спасибо!. - person Brett; 18.06.2013
comment
Если бы эта информация о делегате приложения все еще была на главной CLLocationManager странице документации, то, вероятно, вы бы ее увидели ;) - person Daniel; 18.06.2013
comment
Для тех, кто находит это, к сожалению, в iOS7 это уже не так. Если пользователь принудительно закроет приложение, дважды коснувшись дома и сдвинув вверх в многозадачном режиме, перезапустить его будет НЕВОЗМОЖНО. Цитируя pmarcos с форумов Apple: «Как мы говорили на сессии «Что нового в многозадачности» на WWDC в июне, это меняется для iOS 7. Когда пользователь убивает приложение в iOS 7, ОС ни по какой причине не перезапустит его. .' - person pj4533; 11.10.2013
comment
@ pj4533 спасибо, это то, что я пропустил. Это плохо, как тогда это должно работать? doc говорит, что перезапустит прекращенное приложение. - person Marcin; 30.10.2013
comment
Марчин, инженеры Apple заявили на WWDC, что, поскольку все приложения могут запускаться в фоновом режиме на iOS 7, делать некоторые вещи, обновлять свои снимки и снова переходить в спящий режим, было бы странно для приложения, которое вы явно бросить просыпаться, как каждый час или около того. Чтобы быть последовательным, пользователи приложений, которые пользователи явно закрыли, теперь никогда не будут просыпаться в фоновом режиме, как сказал pj4533. - person wander; 09.12.2013
comment
iOS 7.1 должна была изменить это поведение. То есть ios 7.1 должен был перезапустить ваше приложение, даже если оно не работало в фоновом режиме. Но я могу подтвердить, что это все еще проблема. Это не ограничивается только сторонними приложениями. Даже родные приложения Apple, такие как поиск друзей или напоминание, имеют эту проблему в iOS 7.x. - person RawMean; 12.04.2014
comment
Это все еще верно для iOS8, я использую -startMonitoringForRegion. но когда пользователь завершает работу, приложение не перезапускается, несмотря на то, что Apple говорит иначе: goo.gl/Q0Bo8W. Единственным исключением являются приложения определения местоположения, которые в iOS 8 и более поздних версиях перезапускаются после принудительного закрытия пользователем. - person Mahakala; 13.11.2014
comment
@ pj4533 и любой другой, кто здесь, может найти это полезным. Согласно Apple Docs, служба мониторинга регионов обычно доставляет события, когда приложение работает на переднем плане или в фоновом режиме. (Эту службу можно использовать как для географических регионов, так и для регионов-маяков.) Для завершенного приложения iOS эта служба перезапускает приложение для доставки событий. Для использования этого сервиса требуется авторизация «Всегда» от пользователя. - person Gautam Jain; 10.07.2015
comment
@Daniel, у вас есть примеры для мониторинга региона в фоновом режиме? - person Mahesh reddy; 29.02.2016
comment
@GautamJain Вы проверили, запускается ли приложение без вывода сообщений о местоположении? Мое требование - получить местоположение пользователя (в убитом состоянии) и отправить его на сервер. - person Nikhil Manapure; 11.04.2017
comment
@NikhilManapure - Да, это работает, только если у вас всегда есть авторизация, а не только при использовании. Вы также можете попробовать геозону. Зарегистрируйте геозону, нажмите на нее, и приложение запустится в фоновом режиме, даже если оно будет убито. Опять же, вам всегда нужна авторизация. - person Gautam Jain; 13.04.2017
comment
@GautamJain Большое спасибо, обязательно попробую. - person Nikhil Manapure; 13.04.2017
comment
Обычно требуется много времени, чтобы получить уведомление о закрытии приложения. Есть ли способ уменьшить его? - person SuperJMN; 22.06.2017

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

Если вы запускаете эту службу, а ваше приложение впоследствии завершается, система автоматически перезапускает приложение в фоновом режиме, если поступает новое событие...

(из документов CLLocationManager)

person Wain    schedule 18.06.2013

Если вы используете возможности мониторинга региона, вы можете каким-то образом возобновить свое приложение, даже если оно закрыто, обычно путем создания локального уведомления, таким образом, пользователь может арендовать приложение и выполнять определенную задачу, просматривая словарь параметров в -applicationDidFinishLaunchingWithOptions:

person Andrea    schedule 18.06.2013

Существуют службы, которые перезапускают приложение, чтобы сообщать об обновлениях местоположения, даже если приложение закрыто.
Следующая документация будет полезна. https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/handling_location_events_in_the_background#2865362

введите здесь описание изображения

person tikidunpon    schedule 06.11.2020