when usage tutorial startupdatinglocation manager example description current cllocationmanagerdelegate iphone objective-c gps location core-location

iphone - usage - startupdatinglocation swift



CoreLocation Accuracy Woes (3)

Recientemente, he abordado este problema y descubrí, al leer inteligentemente la documentación por fin, que CoreLocation se ejecuta en un hilo separado, por lo que puede iniciarlo y luego recuperar eventos a medida que se actualiza. Está en la documentación bajo la rúbrica "Obtener la ubicación del usuario" . Así que aquí es donde comienzas a actualizar:

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

Si haces al delegado "self", enviará eventos a la misma clase donde se define el método de inicio, entonces solo tienes que agregar lo siguiente para recuperar los eventos:

- (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]; } }

De esta forma seguirá recibiendo eventos y luego apague el receptor GPS para ahorrar energía. Por supuesto, necesita un tiempo de espera y una forma de almacenar y aceptar la ubicación con la mejor precisión horizontal si se agota el tiempo, pero aún no he resuelto cómo hacerlo.

Tengo un programa con un administrador de ubicación configurado de esta manera:

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

Necesito la precisión dentro de los diez metros, sin embargo, se necesitan algunas llamadas del método delegado didUpdateToLocation para encontrar la ubicación con esa precisión. ¿Cómo voy a retrasar la llamada de este método o simplemente indicar cuándo se logra la precisión deseada para continuar con el programa?

En este momento, intenta ingresos con la primera ubicación devuelta. Incluso la segunda actualización de ubicación no es tan precisa como se esperaba.

¡Gracias por adelantado!


Como cada llamada de delegado incluye una cifra de precisión, simplemente regrese del método hasta alcanzar la precisión deseada (advertencia: eso puede no ocurrir nunca).

No se puede simplemente saltar a un resultado de diez metros; hay una razón por la que se llama precisión "deseada" y no precisión obligatoria. Tienes que darle tiempo para calcular posiciones más exactas.


Una estrategia es iniciar un temporizador por un período de tiempo suficiente como para obtener una solución (que también será aceptable para el usuario)

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

Inicie el administrador de ubicación entregando actualizaciones. Cuando el temporizador caduque (u obtenga una precisión aceptable) detenga las actualizaciones y use esa ubicación.

Probablemente sea lo mejor que obtendrás. Es posible que desee darle al usuario la opción de volver a intentar una ubicación si todavía no es lo suficientemente precisa.