Ich konnte nicht herausfinden, wie ich mit einem Szenario umgehen soll, in dem sich das Telefon bereits in einer Region befindet, wenn startMonitoringForRegion
aufgerufen wird. Andere Fragen haben vorgeschlagen, requestStateForRegion
in didStartMonitoringForRegion
aufzurufen und dann die Methode didDetermineState: forRegion:
aufzurufen. Der Code sieht also ungefähr so aus:
Jetzt ist natürlich die Methode geofenceRegion meine eigene und es funktioniert gut, und die Objekte enthält Dinge wie Lat long und Radius und das alles funktioniert auch gut, so dass das hier nicht das Problem ist.
Wie auch immer, das Problem mit dem obigen Code ist, dass es funktioniert, wenn der Benutzer bereits in der Region ist, wenn er die Region zu seinem Gerät hinzufügt (dh. didEnterRegion ist fertig). Das Problem ist jedoch, dass die Methode didDetermineState: forRegion:
auch jedes Mal aufgerufen wird, wenn eine der Grenzregionen gemäß den Apple-Dokumenten überschritten wird:
Der Standortmanager ruft diese Methode immer dann auf, wenn ein Grenzübergang für eine Region vorliegt. Sie ruft diese Methode zusätzlich zum Aufruf des locationManagers auf: didEnterRegion: und locationManager: didExitRegion: methods. Der Standortmanager ruft diese Methode auch als Reaktion auf einen Aufruf seiner requestStateForRegion: -Methode auf, die asynchron ausgeführt wird.
Nun wird daher jedes Mal, wenn eine Region eingegeben wird, didEnterRegion
automatisch aufgerufen, aber dann wird es erneut aufgerufen, weil didDetermineState: forRegion:
automatisch auch wie in den Apple-Dokumenten aufgerufen wird und dies dazu führt, dass didEnterRegion
erneut aufgerufen wird Die Region wird zweimal eingegeben, wenn ich sie nur einmal eingeben möchte. Wie kann ich das vermeiden?
Danke für Ihre Hilfe.
LÖSUNG
Die Lösung ist wirklich so einfach, ich habe es einfach falsch gemacht. Ich musste wählen, entweder die 2 Methoden didEnterRegion:
und didExitRegion
zu verwenden oder didDetermineState: forRegion
zu verwenden und meine eigenen Methoden für das Betreten und Verlassen der Region zu erstellen, beide sollten nicht verwendet werden .
Also habe ich gewählt, nur die didDetermineState: forRegion
-Methode zu verwenden und mein Code sieht jetzt so aus:
Bitte beachten Sie, dass bei dieser Methode die Exit-Region für die Region aufgerufen wird, wenn nicht drinnen und wenn Sie wie ich nur möchten, dass der Exit nach einer Eingabe erfolgt, dann brauchen Sie eine Art der Überprüfung, ob Die Region wurde bereits eingegeben (ich selbst habe die Kerndaten verwendet, da ich bereits andere Aspekte der Regionen hier abspeicherte).
%Vor%Verwenden Sie locationManager: didEnterRegion: überhaupt nicht, da locationManager: didDetermineState: forRegion: Ihnen alle Informationen liefert, die Sie zum Auslösen des Zugangscodes benötigen. was übrigens nicht der locationManager: didEnterRegion: sein sollte, verwenden Sie Ihren eigenen Selektor, der nicht Teil des CLLocationManagerDelegate Protokolls ist.
Ein anderer Ansatz besteht darin, innerhalb einer Regionsposition zu testen, wenn mit der Überwachung einer Region begonnen wird. Diese Lösung ist nicht so trivial, wie es sich anhört: Sie müssen zuerst den aktuellen Standort aktualisieren, indem Sie startUpdatingLocation aufrufen, da das Lesen der location -Eigenschaft von locationManager Ihnen wahrscheinlich schales oder extrem ungenaues Lesen liefert.
Tags und Links ios cllocationmanager geofencing clregion