Жизненный цикл приложения iOS относительно CLLocationManager startMonitoringForRegion

В iOS можно предположительно использовать метод startMonitoringForRegion: CLLocationManager для регистрации делегата для ответа на перемещение устройства в определенный географический регион, даже если приложение не запущено. Из справочника по классу CLLocationManager:

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

Я предполагаю, что если приложение будет перезапущено, iOS на самом деле не выведет его на передний план. Я не смог найти хороших примеров, иллюстрирующих, где startMonitoringForRegion вписывается в общее приложение, поэтому мои вопросы таковы:

  1. Нужно ли регистрировать делегата для startMonitoringForRegion откуда-то конкретно? Я предполагаю, что его нельзя вставить в контроллер представления, если мы запускаем приложение, не выводя его на передний план. Может ли кто-нибудь привести пример с некоторым контекстом вокруг него?
  2. Если мы решим, что действительно хотим вывести приложение на передний план в результате входа в регион, как мы это сделаем?
  3. Когда startMonitoringForRegion регистрируется в ОС и когда не регистрируется? Должен ли пользователь запускать приложение хотя бы один раз (даже если оно уже было убито) для первоначальной регистрации? А если пользователь выключит устройство? Будет ли зарегистрирован наш обработчик при следующем включении устройства, или пользователю придется запускать приложение хотя бы еще раз?

person Bryce Thomas    schedule 09.10.2012    source источник
comment
Ссылка на класс означает, что приложение будет перезапущено, а в applicationDidFinishLaunching:option параметры будут содержать ключ «UIApplicationLaunchOptionsLocationKey», чтобы указать, что приложение перезапущено из-за обнаруженных контролируемых регионов didEnterRegion/didExitRegion. Если ключ обнаружен, вам нужно будет повторно инициализировать диспетчер местоположений и делегатов, прежде чем вы сможете выполнять какие-либо действия внутри делегатов.   -  person nhisyam    schedule 07.03.2013


Ответы (1)


Нужно ли регистрировать делегата для startMonitoringForRegion из какого-то определенного места? Я предполагаю, что его нельзя вставить в контроллер представления, если мы запускаем приложение, не выводя его на передний план.

Ложь. Объект контроллера представления по-прежнему действительно существует, если он выделен-инициализирован, даже если его содержимое не представлено.

Если мы решим, что хотим вывести приложение на передний план в результате входа в регион, как мы это сделаем?

Невозможно использовать общедоступные API (я не уверен, может ли приложение в фоновом режиме использовать - [UIApplication openURL:] со своей собственной схемой URL-адресов, чтобы перейти в фоновый режим, но я сомневаюсь в этом); однако вы можете использовать платформу SpringBoardServices для запуска своего приложения:

SBSLaunchApplicationWithIdentifier(CFSTR("com.mycompany.theBestiPhoneAppEver"), false);

Когда startMonitoringForRegion регистрируется в ОС и когда не регистрируется? Должен ли пользователь запускать приложение хотя бы один раз (даже если оно уже было убито) для первоначальной регистрации?

Если пользователь никогда не запускает ваше приложение, код внутри никогда не будет запущен, поэтому он не будет зарегистрирован.

А если пользователь выключит устройство? Будет ли зарегистрирован наш обработчик при следующем включении устройства, или пользователю придется запускать приложение хотя бы еще раз?

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

person Community    schedule 09.10.2012