2016-04-15 10 views
0

Ich verwende CLLocationManager, um den aktuellen Standort des Benutzers abzurufen. Ich benötige den aktuellen Standort des Benutzers, da ich die Open Weather API verwende, um die Wetterdaten anzuzeigen, wo auch immer sich der Benutzer befindet. Mein Problem ist, dass beim ersten Öffnen der App der Wert für lat und long 0, 0 ist. Aber wenn ich die App erneut starte, funktioniert es gut. So werden nur beim ersten Start der App falsche Lat- und Long-Werte verwendet. Ich mache alle meinen Satz in viewDidLoad auf, hier ist der Code ...Latidude und Longitude sind beim ersten Start der App falsch ios

locationManager = [[CLLocationManager alloc] init]; 
[locationManager requestAlwaysAuthorization]; 
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
    [self->locationManager requestWhenInUseAuthorization]; 

[locationManager startUpdatingLocation]; 

Ich weiß nicht, was ich falsch mache. Hat es etwas damit zu tun, den Lat und Long im View Controller statt App Delegate zu bekommen?

Hier ist, wie ich die Lage Werte bin immer:

locationManager.location.coordinate.latitude 
locationManager.location.coordinate.longitude 
+0

Der Code zeigt nicht, wie Sie den Standortwert abrufen und verarbeiten. Ich schlage vor, Sie teilen das auch. Ist es ein Simulator oder ein echtes Gerät? –

+0

Okay, diesen Code jetzt posten. Und ich benutze ein tatsächliches Gerät. Dieser Fehler tritt jedoch sowohl auf dem Simulator als auch auf dem Gerät auf. –

+0

Wollen Sie sagen, dass diese beiden Zeilen den vorherigen Codezeilen innerhalb desselben Blocks/derselben Methode folgen? –

Antwort

1

Es passiert, weil beim ersten Start der App Standortmanager fragt Benutzerzugriff auf aktuellen Standort und wann Benutzer erlaubt - Es dauert wenig Zeit in den aktuellen Standort zu holen und Sie zugreifen auf Koordinaten vor der Fertigstellung von dieser Prozess.

Wenn Sie Ihre App erneut starten Location Manager erkennt, dass Sie bereits die Erlaubnis gab, so gibt es Ihnen aktuelle Standortkoordinaten sehr schnell.

Die Lösung ist also - Sie müssen warten, bis die Standortaktualisierung abgeschlossen ist opt. Sie können dort Versand mit some kinda verzögern setzen können oder Location-Manager Delegatmethode didUpdateUserLocation oder wenn Ihr UIViewController ist nicht die erste Ansicht Controller verwenden - in diesem Fall sollten Sie diesen Prozess in AppDelegate implementieren, verwenden Sie den Code in didFinishLaunching, wenn Sie also Ihren View-Controller öffnen (unabhängig davon, welchen Navigationsfluss Sie verwenden), werden Standortdetails angezeigt, da der Location Manager in der Zwischenzeit Ihren Standort verfolgt.

Ich hoffe, es wird dir helfen!

+0

Danke, es hat bei mir funktioniert. Was ich getan habe, war in NSUserDefaults Ich habe überprüft, ob dies das erste Mal ist, dass der Benutzer die App startet, und wenn es war, habe ich einen Boolean auf True gesetzt. Und dann habe ich im View-Controller den Wert des booleschen Wertes überprüft und, falls er wahr war, habe ich die HTTP-Anfrage nach 5 Sekunden ausgeführt. –

0

Sie sollten für einen negativen Wert horizontalAccuracy des CLLocation Objekt prüfen und nutzen nicht die lat/lon Wert, wenn das der Fall ist. Es ist sehr wahrscheinlich, dass, wenn Sie sehen, dass die Breiten-/Längengradwerte 0/0 sind, das GPS keine Standortverriegelung gesichert hat.

+0

horizontale Genauigkeit macht 65. Was soll ich tun? Sollte ich einen Completion-Handler hinzufügen und nur Wetter anzeigen, sobald lat und long abgerufen wurden? –

+0

Sie sollten die Granularität des Wetterdienstes überprüfen und mit der horizontalen Genauigkeit des GPS vergleichen. – adib