manager ios cllocationmanager cllocation

ios - manager - core location swift 4



CLLocationManager y problemas de precisión: ¿alguna experiencia? (2)

De la respuesta de donkim considera reemplazar esta línea

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

con linea

[NSObject cancelPreviousPerformRequestsWithTarget: self];

Así que estoy tratando con algunos problemas de precisión con iPhone GPS. Tengo una aplicación que utiliza la ubicación.

En el método delegado locationManager: didUpdateToLocation: fromLocation: me está devolviendo una ubicación. A partir de un poco de investigación, parece que el GPS no siempre es preciso en el primer resultado que devuelve, incluso al configurar la propiedad kCLLocationAccuracyBest en kCLLocationAccuracyBest .

Para evitar esto, no llamo a stopUpdatingLocation antes de que se devuelva newLocation: al menos 3 veces (esto es muy rápido). También he jugado con otros dos "requisitos" para si dejar de stopUpdatingLocation y devolver la newLocation . Una de las formas en que lo intenté fue verificar el tiempo y la duración de newLocation y compararlos con oldLocation y, si no fueran idénticos, mantener la actualización de la ubicación en ejecución. También intenté verificar la distancia entre la oldLocation newLocation y la oldLocation newLocation y, si es inferior a 20 metros, está bien. Ambos de estos se prueban con la devolución de al menos 3 ejecuciones. La última forma es menos "estricta", ya que newLocation y oldLocation es bastante difícil de conseguir con ser 100% idéntico si el usuario está en un vehículo en movimiento.

Ahora, mi problema es que incluso al hacer lo anterior (básicamente no aceptar una ubicación, hasta que se hayan producido algunas actualizaciones en CLLocationManager Y comprobar la distancia entre las CLLocations (o si son idénticas) todavía estoy viendo resultados algo extraños para las ubicaciones a veces, al probar.

Sería reparaciones a veces si dejo la aplicación, entro en Maps.app, uso el GPS, luego abro la multitarea, forzo el cierre de la aplicación y luego la vuelvo a abrir para obtener un inicio limpio.

¿Alguna experiencia y posibles soluciones que las personas hayan usado para solucionar el mismo tipo de problema? Comentarios y soluciones apreciados :)


No recuerdo de qué proyecto era exactamente de donde obtuve el siguiente código, pero esto me ha funcionado muy bien (recuerdo que fue de un video de la WWDC 2010). En mi código, dejé los comentarios del proyecto original intactos, así que espero 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 el proyecto de ejemplo " GetLocationViewController.m de Apple, disponible en:

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