geofence — проверить, не находится ли пользователь уже внутри забора

геозона в iOS 7.1 и выше. поэтому, когда пользователь уже находится внутри геозоны и, скажем, видит рекламу приложения и только затем загружает приложение из магазина приложений и открывает приложение. На этом этапе приложение должно дать пользователю определенное сообщение (но только один раз). КАК этого можно достичь?

Позже приложение регистрирует регион и отслеживает его как обычно, поэтому, когда пользователь входит в регион и выходит из него, происходят определенные вещи.

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

Когда приложение запускается в этом сценарии, я вижу следующую последовательность api в iphone 5s

 locationManager startMonitoringForRegion
 <location permission popup>
 locationManager:didStartMonitoringForRegion: (in this delegate method i can call the below to check if the device is already inside the region) 
   |-locationManager requestStateForRegion: 
 locationManager:didDetermineState: (fired as a result of the requestStateForRegion: call)

Но locationManager:didDetermineState: также вызывается при входе и выходе из региона.

 locationManager:didExitRegion:
 locationManager:didDetermineState:

Итак, мне нужно будет хранить состояние, которое для определенного региона и начального сообщения уже отображалось? и поэтому не отображайте его, если это состояние существует .. звучит хаки!


person inforeqd    schedule 11.09.2014    source источник
comment
Как часто вы хотите показывать это сообщение? Похоже, вы хотите показывать сообщение один раз для каждого региона в течение всего срока службы приложения. В этом случае вам уже нужно сохранять состояние отображения сообщений для каждого региона. Если вы хотите определить разницу между входом/выходом и запуском I внутри региона, кажется, что первое обычно происходит только на заднем плане, а второе — на переднем плане. Возможно, [[UIApplication sharedApplication] applicationState] будет полезен для вашего варианта использования.   -  person Asa    schedule 16.09.2014
comment
Да, я хочу сказать, чем отличается вход/выход от того, что я впервые запустил внутри региона. Поскольку приложение можно запускать несколько раз, applicationState не будет окончательным, если, как вы упомянули выше, приложение локально не хранит и не управляет отображаемым состоянием сообщения для каждого региона. Правильно ли я так думаю?   -  person inforeqd    schedule 17.09.2014


Ответы (1)


Чтобы определить, находится ли приложение в регионе, когда начинается мониторинг, выполните следующие действия:

 [locationManager requestStateForRegion: region];

Когда CLLocationManager определяет состояние данного региона, его делегату отправляется следующее:

- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    // When regions are initialized, see if we are already within the geofence.
    switch (state)
    {
        case CLRegionStateInside:
            // We are in the region.
            break;
        case CLRegionStateUnknown:
        case CLRegionStateOutside:
        default:
            break;
    }
}
person Patrick J Caraher    schedule 17.09.2014