Geocerca do iOS, como lidar com a região quando o monitoramento é iniciado?
Não consegui descobrir como lidar com um cenário em que o telefone já está dentro de uma região quandostartMonitoringForRegion
é chamado? Outras perguntas sugeriram chamadasrequestStateForRegion
dentrodidStartMonitoringForRegion
isso então chama o métododidDetermineState: forRegion:
. Portanto, o código se parece com isso:
- (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];
}
}
Agora, obviamente, o método geofenceRegion é meu e funciona bem, e os objetos contêm coisas como lat long e radius e que tudo funciona bem também, de modo que esse não é o problema aqui.
De qualquer forma, o problema com o código acima é que ele funciona se o usuário já estiver dentro da região ao adicionar a região ao dispositivo (por exemplo, didEnterRegion está pronto). No entanto, o problema é que o métododidDetermineState: forRegion:
também é chamado toda vez que uma das regiões de fronteira é atravessada de acordo com os documentos da apple:
O gerente de localização chama esse método sempre que houver uma transição de limite para uma região. Ele chama esse método além de chamar os métodos locationManager: didEnterRegion: e locationManager: didExitRegion:. O gerenciador de localizações também chama esse método em resposta a uma chamada ao método requestStateForRegion:, que é executado de forma assíncrona.
Agora, por isso, toda vez que uma região é inserida,didEnterRegion
é chamado automaticamente, mas é chamado novamente porquedidDetermineState: forRegion:
também é chamado automaticamente de acordo com os documentos da apple e isso resulta emdidEnterRegion
sendo chamado novamente para que a região seja inserida duas vezes quando eu quero que seja inserida apenas uma vez. Como posso evitar isso?
Obrigado pela ajuda.
SOLUÇÃO
A solução é realmente tão simples que eu estava fazendo o caminho errado. Eu tive que optar por usar os 2 métodosdidEnterRegion:
edidExitRegion
ou usedidDetermineState: forRegion
e criar meus próprios métodos para entrar e sair da região,ambos não devem ser usados.
Então, eu escolhi usar apenas odidDetermineState: forRegion
método e meu código agora se parece com isso:
Observe que, com esse método, a região de saída será chamada para a região, se não estiver dentro, e se, como eu, você quiser que a saída ocorra apenas após a entrada, será necessário algum tipo de método para verificar se a região já foi inserida. (Eu mesmo usei dados principais, pois já estava usando isso para armazenar outros aspectos das regiões).
- (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
}