2015-05-17 9 views
8

Мне не удалось решить, как обрабатывать сценарий, когда телефон уже находится внутри региона, когда вызывается startMonitoringForRegion? Другие вопросы предложили позвонить requestStateForRegion внутри didStartMonitoringForRegion, затем он вызывает метод didDetermineState: forRegion:. Таким образом, код выглядит примерно так:iOS Geofence, как обращаться, когда внутри региона при запуске мониторинга?

- (void)viewDidLoad { 
    //location manager set up etc... 
    for (Object *object in allObjects){ 

     CLRegion *region = [self geofenceRegion:object]; 
     [locationManager startMonitoringForRegion:region]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 

    [self.locationManager requestStateForRegion:region]; 
    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { 

    if (state == CLRegionStateInside){ 
     [self locationManager:locationManager didEnterRegion:region]; 
    } 
} 

Теперь, очевидно, метод geofenceRegion мои собственный и она отлично работает, и объекты содержат такие вещи, как Lat долго и радиус, и что все работает нормально, а так, что не проблема здесь.

В любом случае проблема с приведенным выше кодом заключается в том, что он работает, если пользователь уже находится внутри региона, когда он добавляет регион к своему устройству (т. Е. DoneEnterRegion завершен). Однако проблема заключается в том, что метод didDetermineState: forRegion: также называется каждый раз, когда один из пограничных областей проходит в соответствии с яблонь документы:

Менеджер местоположения вызывает этот метод всякий раз, когда есть граница перехода для региона. Он вызывает этот метод в дополнение к вызову метода locationManager: didEnterRegion: и locationManager: didExitRegion:. Менеджер местоположений также вызывает этот метод в ответ на вызов метода requestStateForRegion:, который выполняется асинхронно.

Теперь из-за этого каждый раз, когда область вводится, didEnterRegion автоматически вызывается, но тогда это называется снова, потому что didDetermineState: forRegion: также вызываются автоматически в соответствии с яблонями документов, и это приводит к didEnterRegion вызывается снова, чтобы регион дважды вводится, когда я хочу, чтобы он был введен один раз. Как я могу избежать этого?

Благодарим за помощь.

РЕШЕНИЕ

Решение действительно настолько просто, я как раз собирался об этом неправильном пути. Мне пришлось выбрать либо использовать 2 метода didEnterRegion: и didExitRegion, либо использовать didDetermineState: forRegion и создать свои собственные методы для входа и выхода из региона, оба не должны использоваться.

Так я решил использовать только метод didDetermineState: forRegion и мой код теперь выглядит следующим образом:

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

- (void)viewDidLoad { 
    //location manager set up etc... 
    for (Object *object in allObjects){ 

     CLRegion *region = [self geofenceRegion:object]; 
     [locationManager startMonitoringForRegion:region]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 

    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { 

    if (state == CLRegionStateInside){ 

     [self enterGeofence:region]; 

    } else if (state == CLRegionStateOutside){ 

     [self exitGeofence:region]; 

    } else if (state == CLRegionStateUnknown){ 
     NSLog(@"Unknown state for geofence: %@", region); 
     return; 
    } 
} 

- (void)enterGeofence:(CLRegion *)geofence { 

    //whatever is required when entered 
} 

- (void)exitGeofence:(CLRegion *)geofence { 

    //whatever is required when exit 
} 
+0

В соответствии с этой [meta post] (https://meta.stackoverflow.com/q/262806/5175709). Лучше не включать ответ в сам вопрос. Либо напишите отдельный ответ, либо просто примите данный ответ или напишите комментарий. – Honey

ответ

4

Только не используйте locationManager: didEnterRegion: на всех, как locationManager: didDetermineState: forRegion: дает вам всю информацию, вам нужно, чтобы вызвать на-код, который, кстати, , не должно быть locationManager: didEnterRegion:, используйте свой собственный селектор, который не является частью CLLocationManagerDelegate протокола.

Другой подход заключается в проверке внутри региона, когда он начинает контролировать регион.Это решение не так уж и тривиально, как кажется: вам нужно сначала обновить текущее местоположение, вызвав startUpdatingLocation, так как только чтение свойства location locationManager, вероятно, даст вам устаревшее или крайне неточное чтение.

+0

Какой смысл API, если я должен отслеживать его сам? что просто не кажется логичным вообще? –

+0

В описании API четко указано, что он отслеживает события входа и выхода. Вы хотите получить больше, чем API, а именно, активировать событие ввода при запуске мониторинга изнутри региона. Для этого есть обратный вызов API более низкого уровня, locationManager: didDetermineState: forRegion: и вы можете использовать его, но попытка объединить его с материалом более высокого уровня требует неприятностей. –

+0

Но, как я упомянул в своем вопросе did.DetermineState, также срабатывает при вводе или выходе области. Итак, что вы говорите, мне нужно вручную получить текущее местоположение, когда я начну отслеживать регион, и если это текущее местоположение находится в регионе, я сам его обрабатываю. Игнорирование requestStateForRegion ?. Я просто не могу думать о том, что еще вы бы использовали requestStateForRegion, если не используете мониторинг региона –

 Смежные вопросы

  • Нет связанных вопросов^_^