CLLocationManager y precisión problemas de ningún tipo de experiencia?

Así que estoy tratando con cierta exactitud los problemas con el iPhone GPS. Tengo una aplicación que utiliza la ubicación.

En el método delegado locationManager: didUpdateToLocation: fromLocation: estoy de ser devuelto a un lugar. De un poco de investigación, parece que el GPS no siempre es exacta en el primer resultado que devuelve, incluso cuando la configuración de desiredAccuracy propiedad kCLLocationAccuracyBest.

Con el fin de conseguir alrededor de esto, yo no stopUpdatingLocation antes de que sea devuelto newLocation: al menos 3 veces (es muy rápido). También he jugado con otros dos de los «requisitos» para stopUpdatingLocation y devolver el newLocation. Una manera en que yo intentaba era para comprobar la lat y long para newLocation y comparar a oldLocation y si estos no eran idénticas, a continuación, mantener la ubicación de la actualización de ejecución. También probé con la comprobación de la distancia entre el oldLocation y newLocation y si es menos de 20 metros de altura, está bien. Ambos de estos se ponen a prueba con el regreso de al menos 3 carreras. El último modo es menos «objetiva», ya que newLocation y oldLocation es muy difícil conseguir lejos de ser 100% idénticos si el usuario está en un vehículo en movimiento.

Ahora, mi problema es que, aun cuando de hacer lo anterior (básicamente, la no aceptación de una ubicación, hasta que un par de actualizaciones que se han producido en CLLocationManager Y la comprobación de la distancia entre el CLLocations (o si son idénticos) todavía estoy viendo algo raro resultados para ubicaciones a veces, cuando se prueba.

Sería corrige a veces si quiero salir de la aplicación, ir a los Mapas.aplicación, utilizar el GPS, a continuación, abrir la multitarea, la fuerza de salir de mi aplicación y, a continuación, vuelva a abrirlo para obtener una limpieza de lanzamiento.

Cualquier experiencias y posibles soluciones de personas han utilizado para obtener alrededor de la misma clase de problema? Comentarios y soluciones apreciado 🙂

InformationsquelleAutor runmad | 2011-01-08

2 Kommentare

  1. 45

    No me acuerdo de que el proyecto fue exactamente que tengo el siguiente código, pero este me ha funcionado muy bien (recuerdo que fue a partir de un WWDC 2010 video). En mi código, me fui a los comentarios al proyecto original intacto, así que esperemos que esto ayude.

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
        //test the age of the location measurement to determine if the measurement is cached
        //in most cases you will not want to rely on cached measurements
        NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    
        if (locationAge > 5.0) return;
    
        //test that the horizontal accuracy does not indicate an invalid measurement
        if (newLocation.horizontalAccuracy < 0) return;
    
        //test the measurement to see if it is more accurate than the previous measurement
        if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) {
            //store the location as the "best effort"
            self.bestEffortAtLocation = newLocation;
    
            //test the measurement to see if it meets the desired accuracy
            //
            //IMPORTANT!!! kCLLocationAccuracyBest should not be used for comparison with location coordinate or altitidue 
            //accuracy because it is a negative value. Instead, compare against some predetermined "real" measure of 
            //acceptable accuracy, or depend on the timeout to stop updating. This sample depends on the timeout.
            //
            if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) {
                //we have a measurement that meets our requirements, so we can stop updating the location
                //
                //IMPORTANT!!! Minimize power usage by stopping the location manager as soon as possible.
                //
                [self stopUpdatingLocation:NSLocalizedString(@"Acquired Location", @"Acquired Location")];
    
                //we can also cancel our previous performSelector:withObject:afterDelay: - it's no longer necessary
                [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil];
            }
        }
    }

    Espero que esto ayude!

    A través de GetLocationViewController.m en Apple «ubicarme» proyecto de ejemplo, disponible en:

    https://developer.apple.com/library/content/samplecode/LocateMe/Introduction/Intro.html

    • Ah, perfecto! Debería haber mirado más de cerca a las propiedades de la devuelve CLLocation newLocation, no me di cuenta que también tenía una marca de tiempo. Probablemente voy a usar este junto con mi propio código. Muchísimas gracias!
    • que el de apple «ubicarme» ejemplo: developer.apple.com/library/ios/#samplecode/LocateMe/Listings/…
    • esto es exactamente lo que estoy buscando. Gracias.
    • Es kCLLocationAccuracyBest o kCLLocationAccuracyBestNavigation más precisa? Yo también la necesidad de la velocidad.
    • locationManager.desiredAccuracy es siempre -1 en mi código, ¿por qué? y por cierto, ¿no se supone que ser administrador.desiredAccuracy?
    • leer el comentario en donkim del código. kCLLocationAccuracyBest tiene un valor negativo.

  2. 0

    De donkim la respuesta de considerar la sustitución de esta línea

    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil];

    con la línea

    [NSObject cancelPreviousPerformRequestsWithTarget: self];

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea