Мне не удалось решить, как обрабатывать сценарий, когда телефон уже находится внутри региона, когда вызывается 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
}
В соответствии с этой [meta post] (https://meta.stackoverflow.com/q/262806/5175709). Лучше не включать ответ в сам вопрос. Либо напишите отдельный ответ, либо просто примите данный ответ или напишите комментарий. – Honey