MKMapView die Position falsch ist, auf Start oder fortsetzen
Wenn ich starte meine Anwendung frisch oder fortsetzen nach einer langen Zeit, MKMapView Vorstellung von der userLocation ist falsch und zeigt mir in der Mitte des Meeres.
Ich bin mit dem folgenden code:
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
Passiert, nach einem langen Lebenslauf der app oder brand new start....
- Hey, hast du jemals eine Lösung für dieses problem? War die Lage in lat:0,0 und lange:0.0?
- Ich getroffen habe, das gleiche Problem auch, aber es gibt wenig Informationen online, wie zu beheben. Ich bin neugierig, ob es eine sauberere Möglichkeit außer mit dem letzten bekannten Standort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist das erwartete Verhalten : der Benutzer, der Standort ist nicht immer verfolgt, indem Sie das iPhone mit GPS (es würde verbrauchen zu viel Akku). Also, sobald die Karte angezeigt wird, die
MKMapView
Beispiel zeigt die Letzte "beste" position user es weiß, und dann, verbessert die Genauigkeit durch Aktivierung der Nachverfolgung (dies ist ein nahtloser Prozess, Sie brauchen sich nicht darum zu kümmern) .können Sie überwachen, wenn die
MKMapView
updates der user-Standort auf der Karte, durch die Umsetzung derMKMapViewDelegate
- Protokoll. Einfach umzusetzen :(Mehr Infos aus der apple-Dokumentation hier )
Den code oben in meinem Beispiel überprüft die Genauigkeit der position, die gerade angezeigt werden, indem Sie die Kartenansicht und entsprechend reagiert.
[BEARBEITEN]
Wenn zeigen den Standort der Benutzer in der Mitte des Meeres auf den ersten wirklich stört, können Sie Sie ausblenden, der Benutzer Position, bis Sie eine Position, die genau ist/frisch genug.
Dazu legen Sie die
showsUserLocation
Eigenschaft desMKMapView
zuNO
auf den ersten, bis Sie eine genaue Lage genug (Dank der vorherigen delegate callback) und dann legen Sie es aufYES
.Durch das tun Sie, vermeiden Sie die Anzeige einen Ort, der nicht richtig oder zu alt für diese (es ist ein
timestamp
Eigenschaft in derCLLocation
um zu prüfen, ob es eine alte Lage oder nicht)N. B:Sie nicht zu erstellen
CLLocationManager
Instanz auf Ihrer Seite, die MKMapView schafft eine intern und veröffentlichen Standorte, die es erhält, über diese delegieren selector.Bei der Verwendung CLLocationManager direkt, normalerweise bekommt man eine Cache Position in den ersten Rückruf. Es ist in der Regel ein guter Ort, obwohl alt. Danach bekommen Sie schnell weitere Rückrufe geben bessere Standorte mit Wi-Fi, cell-tower (falls verfügbar). Wenn Sie gebeten haben, < 1000m Genauigkeit, die Sie (nach mehrere Sekunden) GPS-triangulation.
Keiner von denen sein sollte, ungenau genug, um in der Mitte des Ozeans. Ich vermute, dass diese Zeile code:
ist der Zugriff auf die zu koordinieren, während
userLocation
oderlocation
istnil
. WennuserLocation
oderlocation
null ist, wird das Ergebnis 0-Koordinaten. Die Lage des lat=0 und lon=0 ist im Atlantischen Ozean, vor der Küste von Afrika. Man könnte hinzufügen, ein check vonlocation
um sicherzustellen, dass es nicht nil ist, bevor man das koordinieren von it, ie:Werden Sie auch wollen, zu warten, für Rückrufe an den MKMapViewDelegate
mapView:didUpdateUserLocation:
zu wissen, wenn es eine gültige Position vorhanden. Ihre UmsetzungdidUpdateUserLocation:
sollte abwerfen, jeder Ort, hat eine horizontalAccuracy < 0, das deutet auf eine ungültige Position.Dies ist leider eine Funktion des GPS-chip. Es ist nicht immer auf, so werden die Daten in der Regel werden falsch für die ersten paar Momente. Ihre beste Wette wäre wahrscheinlich speichern die Letzte position erfasst, die von der app in NSUserDefaults, dann warten Sie, bis die Genauigkeit zu sein, wo Sie wollen, dass es vor dem Umschalten auf live-Daten, oder sonst verstecken die MkMapView, bis die Genauigkeit ist, wo Sie es haben wollen, dann zeigt es an, dass der Punkt (Sie konnten zeigen, ein lade-Bildschirm in der interim)
Nur als Jeremy Massel schrieb Sie zu Sortieren, die schlechten ersten Positionen auf der app starten /fortsetzen. Einen großen blog-post vor ein paar Monaten:
http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/
Was ich hier mache ist-
Wenn Sie brauchen sehr genaue Position, dann setzen Sie ein Häkchen auf die Genauigkeit als auch ein timeout über die hinaus Sie können nicht dulden, warten und verwenden, die weniger genau fixieren.
Wie weit ist es von Ihrem tatsächlichen Standort? Wenn eine Anwendung gerade startet oder wird fortgesetzt von einem langen Zeitraum der Zeit, den Standort der Benutzer ist generell immer falsch, mit zu beginnen. Wie die Anwendung ausgeführt wird, wird es mehr und mehr genau. Es gibt Methoden, um die Genauigkeit der den Standort der Benutzer in CLLocationManager, zu sehen, welche Art von Werten, die Sie dort bekommen.
In meine apps, die ich diese Methoden verwendet:
Erste - es ist gut, haben eine Standard-position (für das Beispiel - Anwendung ist über eine Stadt -, dann zoom-in zu zeigen, ganze Stadt) (auf erste - erste-app öffnen, wenn keine Daten heruntergeladen)
Zweite - wenn der Benutzer bereits verwendet Karte - speichern können seine Koordinaten, und zeigen Sie die (+ span(zoom) - Ebene) in Fall gibt es keine weiteren Daten verfügbar.
Dritte - im Falle von Daten:
1.) Wenn die Datenbank bereits einige Koordinaten auf der ersten map öffnen (wenn die Anwendung geschlossen wurde) - zoom out/in, um alle pins auf der Karte.
2.) Wenn noch in der Karte und gerade angekommen-updates (z.B. neue Standorte oder etwas verändert), gibt es zwei Möglichkeiten :
2.1.) Wenn Benutzer nicht gezoomt ist in jeder Lage - Karte zoomt in/out auf alle Orte anzeigen.
2.2.) wenn Benutzer vergrößert - Standorten aktualisiert werden, aber die Karte nicht verkleinern
Natürlich gibt es auch ein paar filter-Tasten (zum Beispiel : suchen, Benutzer, Standort, und einige mehr -, die Filter-Standorten, - und Zoom-out/in zu zeigen, gefilterte Ergebnisse)