2009-07-20 5 views
6

Ich habe ein Programm mit einem Standort-Manager wie diese ein:Corelocation Genauigkeit Elende

self.locationManager = [[CLLocationManager alloc] init]; 
[locationManager startUpdatingLocation]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 

Ich muss die Genauigkeit von zehn Metern, aber es dauert ein paar Anrufe des didUpdateToLocation Delegatmethode das finden Ort bei dieser Genauigkeit. Wie würde ich den Aufruf dieser Methode verzögern oder einfach angeben, wann die gewünschte Genauigkeit erreicht ist, um mit dem Programm fortzufahren?

Im Moment versucht es, mit dem ersten Standort zurückgegeben wird. Selbst die Aktualisierung des zweiten Standorts ist nicht so genau wie erwartet.

Vielen Dank im Voraus!

Antwort

7

Da jeder Delegat-Aufruf eine Genauigkeitsziffer enthält, kehren Sie einfach von der Methode zurück, bis die gewünschte Genauigkeit erreicht ist (Warnung: das kann nie passieren).

Sie können nicht einfach zu einem Zehn-Meter-Ergebnis springen - es gibt einen Grund, warum es "gewünschte" Genauigkeit und nicht zwingend Genauigkeit genannt wird. Sie müssen ihm Zeit geben, genauere Positionen zu berechnen.

+0

Wenn ich nach dieser Eigenschaft suche ([newLocation horizontalAccuracy]), wird der LocationManager aus irgendeinem Grund nur zweimal aktualisiert und der newLocation ist beide Male identisch. Weißt du irgendeinen Grund dafür? –

+0

Das ist das beste Ergebnis, das es dann finden konnte. Sie werden nicht immer Ergebnisse innerhalb von zehn Metern erhalten - selbst wenn Sie ein GPS im iPhone haben, muss es manchmal auf die Triangulation von Mobilfunkmasten zurückgreifen. –

2

Eine Strategie ist, einen Timer für einen Zeitraum zu starten lang genug, um einen Fix zu bekommen (was auch für den Benutzer akzeptabel sein wird)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats 

den Standort-Manager starten Updates liefern. Wenn der Timer abläuft (oder Sie eine akzeptable Genauigkeit erhalten), stoppen Sie die Updates und verwenden Sie diesen Speicherort.

Es ist wahrscheinlich das Beste, was Sie bekommen werden. Vielleicht möchten Sie dem Benutzer die Option geben, es erneut für einen Standort zu versuchen, wenn es immer noch nicht genau genug ist.

4

ich vor kurzem dieses Problem und entdecken in Angriff genommen habe, durch geschickte endlich in die Dokumentation zu lesen, dass Corelocation in einem separaten Thread ausgeführt wird, so dass Sie es auf und dann abrufen Ereignisse beginnen, wie es aktualisiert. Es ist in der Dokumentation unter der Rubrik "Getting the User's Location". Also hier ist, wo Sie beginnen Aktualisierung:

- (void)startStandardUpdates 
{ 
    if (nil == locationManager) 
     locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = none; 
    [locationManager startUpdatingLocation]; 
} 

Wenn Sie machen die Delegierten „Selbst“, wird es Veranstaltungen zur selben Klasse schicken, wo die Startmethode definiert ist, so dann nur Sie haben die folgende abzurufen die hinzufügen ereignisse:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation 
{ 
    if (newLocation.horizontalAccuracy < 30.0) 
    { 
     NSLog(@"latitude %+.6f, longitude %+.6f\n", 
       newLocation.coordinate.latitude, 
       newLocation.coordinate.longitude); 
     [manager stopUpdatingLocation]; 
    } 
} 

Auf diese Weise wird es weiterhin Ereignisse empfangen und dann den GPS-Empfänger ausschalten, um Energie zu sparen. Natürlich braucht es eine Auszeit und eine Möglichkeit, den Standort mit der besten horizontalen Genauigkeit zu speichern und zu akzeptieren, wenn das Zeitlimit überschritten wird, aber ich habe noch nicht herausgefunden, wie ich das machen soll.