Location.HorizontalAccuracy zu schlecht, wenn der Standort vom Hintergrund abgerufen wird

8

Ich schreibe eine App, die den Standort des Benutzers überwacht. Ich habe ein CLLocationManager-Objekt, das startMonitoringSignificantLocationChanges verwendet, sodass ich Ortsaktualisierungen aus dem Hintergrund abrufen kann, wenn die App nicht ausgeführt wird. Ich habe meine Anwendung didFinishLaunchingWithOptions so eingerichtet, wenn ich einen Standortschlüssel bekomme, feuere ich meinen Manager auf, um den Standort des Benutzers zu erhalten. Alles funktioniert gut, aber das Problem ist, dass jedes Mal, wenn ich einen Ort aus dem Hintergrund bekomme, die horizontale Genauigkeit dieses Ortes sehr schlecht ist. In den meisten Fällen sind es 1414 m.

Weiß jemand, warum die horizontale Genauigkeit so schlecht ist, wenn der Ort aus dem Hintergrund kommt? Gibt es etwas, was ich tun kann, um Orte mit höherer Genauigkeit im Hintergrund zu finden?

Wenn die App läuft, sind alle Orte, die ich bekomme sehr genau, dies passiert nur, wenn der Ort aus dem Hintergrund kommt. Hat das etwas mit der Anzahl der Mobilfunkmasten in meiner Stadt zu tun? Ich dachte, dass das Gerät möglicherweise GPS-Wifi-Knoten nicht verwendet, um Standorte im Hintergrund zu erhalten.

Wie auch immer, jede Hilfe hier ist willkommen. Bitte teilen Sie Ihre Gedanken.

Danke!

    
Rafael Moreira 21.03.2012, 02:19
quelle

2 Antworten

11

Die Genauigkeit der von CLLocationManager zurückgegebenen Standorte wird von desiredAccuracy , was standardmäßig kCLLocationAccuracyBest ist, und durch die verfügbare Genauigkeit des Geräts. Sie erhalten beispielsweise weniger genaue Standorte, wenn die Akkukapazität des Geräts niedrig ist, oder Sie erhalten genauere Standorte, wenn sie noch von einer anderen App zwischengespeichert werden.

Wenn Sie jedoch unglaublich genaue Koordinaten erhalten, wird eine erhebliche Menge Strom von der Batterie verbraucht und das Gerät wird entleert. Anwendungen im Hintergrund sind wahrscheinlich auf eine viel geringere Genauigkeitsauflösung beschränkt, um die Batterieleistung zu verbessern.

Genaue Standorte erfordern viel Energie, um das GPS-Funkgerät zu verwenden, während weniger genaue Standorte auf nahe gelegene WLAN-Hotspots und Mobilfunkmasten in Reichweite des Telefons angewiesen sind.

Wenn Ihre Anwendung vom Hintergrund aus fortgesetzt wird, versucht das System, die Genauigkeit der Ergebnisse zu verbessern. Es ist ein kniffliges Konzept, aber sehen Sie sich die Google Maps-Anwendung auf Ihrem Telefon an. Zuerst ist der Kreis, der deinen Standort repräsentiert, sehr groß; Wenn das System Ihren Standort genauer erkennt, wird der Kreis kleiner. Diese Visualisierung zeigt, dass das Telefon mehr Energie benötigt, um einen präziseren Standort zu erhalten.

Sie werden ein ähnliches Phänomen mit CLLocationManager sehen, wenn Ihre App vom Hintergrund aus fortfährt: Sie erhalten einen ungenauen Standort und erhalten nachfolgende, genauere Updates.

Es ist ein Kompromiss zwischen Convenience und Akkulaufzeit, den Apple beim Design ihrer APIs machen musste. Die erste Aktualisierung des Standorts eines Benutzers wird wahrscheinlich nicht so genau sein, es sei denn, sie verwenden nur die Google Maps-Anwendung und der Speicherort wird zwischengespeichert.

Der beste Rat, den ich Ihnen geben kann, ist, auf nachfolgende Aktualisierungen vom Standortmanager zu hören und Ihre Benutzeroberfläche entsprechend zu aktualisieren. Viel Glück!

    
Ash Furrow 25.03.2012, 17:10
quelle
9

Wie der Name sagt: Die Benachrichtigung startMonitoringSignificantLocationChanges dient nur dazu, Sie darüber zu informieren, dass sich der Standort des Benutzers erheblich von dem zuletzt überprüften unterscheidet. Es ist Ihre Aufgabe, wenn Sie diese Benachrichtigung erhalten, um Ihren Standort entsprechend der gewünschten Genauigkeit zu aktualisieren. Die Benachrichtigung wird dies nicht für Sie tun. Es wird Sie nur wissen lassen, dass sich der Standort geändert hat, damit Sie die Situation entsprechend behandeln können. Wenn Sie nicht wissen, wie Sie eine bessere Genauigkeit erhalten, sollten Sie den Apple-Beispielcode für LocateMe ausprobieren. Hier ist ein Ausschnitt, der die Genauigkeit speichert (bestEffortAtLocation) und dann jedes Mal, wenn der Delegat aufgerufen wird, die Genauigkeit testet, bis ein besseres Ergebnis erzielt wird in oder eine Zeitüberschreitung auftritt.:

%Vor%

Das Guthaben geht an Apple, da es sich um einen Ausschnitt aus ihrem Beispielcode LocateMe handelt:

Ссылка

Wenn Sie also die Benachrichtigung erhalten und ein besseres Ergebnis erzielen müssen, müssen Sie die Genauigkeit aktualisieren und prüfen, ob dies zu einem besseren Ergebnis führt.

    
Hubert Kunnemeyer 30.03.2012 18:16
quelle