2010-12-27 11 views
9

Tengo un problema con mi aplicación. Estoy tratando de encontrar la ubicación del usuario con la mejor precisión para determinar su código postal. Actualmente tengo un botón que, cuando se presiona, inicia un método llamado locateMe.¿Cómo se espera hasta que la ubicación se encuentre por completo? (Ubicación principal)

-(IBAction)locateMe; { 
self.locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
[locationManager startUpdatingLocation]; 

Luego he implementado didUpdateToLocation:

-(void)locationManager:(CLLocationManager *)manager 
     didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation; { 

     NSLog(@"Found location! %f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude); 
} 

que había hecho previamente mucho más complicado cosas en didUpdateToLocation pero como ya he probado algunas cosas que se dieron cuenta de que el primer lugar que encontró no era precisa en lo más mínimo . Por lo tanto, puse la llamada NSLog allí y me dio una salida similar a la de abajo ...

Found location! 39.594093,-98.614834 
Found location! 39.601372,-98.592171 
Found location! 39.601372,-98.592171 
Found location! 39.611444,-98.538196 
Found location! 39.611444,-98.538196 

Como se puede ver, en primer lugar me da un valor que no es correcto, que estaba causando problemas dentro de mi aplicación porque no estaba dando la ubicación correcta.

Así que, esta es mi pregunta. ¿Hay alguna manera de que pueda esperar a que el administrador de ubicación termine de encontrar la ubicación más precisa?

¡Gracias de antemano!

EDIT: estoy queriendo algo como esto:

if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { 
} 

Pero nunca es llamada!

Respuesta

5

Core Location suele llamar a didUpdateToLocation con la ubicación detectada durante la sesión anterior. De modo que puede omitir la primera ubicación que le envíe. Y si está calculando la velocidad del usuario según estos datos, debe conocer ese comportamiento. Los peatones a 100 mph son habituales en ese caso. :)

Si está enviando comentarios o fotos con coordenadas geográficas, comience a recibir coordenadas geográficas cuando el usuario entre para escribir una pantalla de comentarios. mientras escribe un mensaje: la ubicación detectada se vuelve bastante precisa.

+0

Ahora que lo mencionas, creo que debería comenzar a recibir la ubicación tan pronto como se abra la vista de configuración (aquí es donde estoy agarrando mi ubicación). –

+0

De acuerdo. Si comienza a detectar la ubicación demasiado pronto, se agotará la batería del dispositivo. Así que recomiendo detectar la ubicación solo cuando sea realmente necesario. –

+0

Gracias por su ayuda. ¿Cómo puedo descartar la primera ubicación que da? ¿Usaría un contador? –

2

Para que realmente pueda ver lo que está sucediendo, intente NSLogging de la propiedad horizontal de precisión de su objeto newLocation. Verás que se está reduciendo en la ubicación con cada golpe.

Eso significa que luego puede PRUEBA la precisión horizontal cuando su administrador de ubicación le proporciona una actualización, y descarta aquellas que son demasiado imprecisas para su uso.

+0

Ah, tiene sentido. Nunca supe sobre esa propiedad. :) –

1

NSLog() la propiedad oldLocation, creo que debería (¿o no debería ser?) Ser nula. y se puede ocultar la userLocation si algo ha fallado:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    mapView.showsUserLocation = NO; 
} 

// EDIT: el desiredAccuracy dice que la única didUpdateToLocation se llama a si se mueve tan lejos de la antigua posición. Si configura la precisión deseada en 100m, solo se ejecutará cuando el usuario se aleje 100 metros de su posición anterior.

+0

Cuando se inicia por primera vez, el 'oldLocation' es nulo. Después de un nivel hacia abajo (en precisión), se vuelve no-nil. –

+0

sí, eso es lo que quiero decir. Puede verificar si es nulo y no ejecutar el código que normalmente haría. –

+0

Pero incluso cuando es no-nil, aún no es el nivel de precisión que necesito. –

1

Ahorre la hora de inicio (o activación) de su aplicación, y deseche los resultados del administrador de ubicación que sean anteriores a la fecha de lanzamiento de la aplicación. CLLocation tiene una marca de fecha.

+0

Gracias por su respuesta. No estoy seguro de que entiendas lo que quiero decir. No inicio el administrador de ubicación hasta que se carga una vista de configuración. Quiero esperar hasta que la ubicación sea más precisa, luego tomar los datos de ubicación. Esa fue mi pregunta. –

+0

Correcto, pero igual puede almacenar la hora de inicio de la aplicación y no usar ninguna ubicación anterior a esa fecha, o en su caso podría almacenar la fecha en que se inició el administrador de ubicación, equivaldría a lo mismo. –

+0

Esto podría ser un poco complicado si inician la aplicación y luego la abandonan (es decir, entran en segundo plano). Al menos este es mi caso de uso con la aplicación Mapas (inicio, pausa, abrir, pausa). Teniendo en cuenta que estoy en mi automóvil, la ubicación resultante puede ser bastante lejana. Pero como una especie de solución de todo lo demás ha fallado, no es mala. – pschang

9

No veo cómo esperas que esto funcione. No hay garantía de que alguna vez obtenga una ubicación con un nivel específico de precisión.Estás asumiendo que eventualmente obtendrás una ubicación que tenga la precisión informada que deseas y que no necesariamente sucederá. LocationManager le enviará una secuencia de actualizaciones de ubicación que generalmente, pero no siempre, son cada vez más precisas. Lamentablemente, no puede exigir que el dispositivo reciba una señal lo suficientemente fuerte como para proporcionarle una posición de precisión arbitraria y no hay manera de que el dispositivo pueda predecir el futuro para decir "esta es la posición más precisa que obtendré". .

Puede tratar de almacenar todas las ubicaciones informadas durante un intervalo de tiempo o hasta que la precisión informada parezca estabilizarse y acepte que después de varios segundos probablemente no obtenga una posición significativamente más precisa. Luego puede usar la última posición informada, o la más precisa, o un punto central ponderado de todas ellas, o lo que sea que crea que tiene sentido.

Dado que dices que esto se va a utilizar para realizar una geocodificación inversa para obtener un código postal, me pregunto por qué es una preocupación. Incluso la posición más granular probablemente pegue en el código postal actual del usuario e incluso la más precisa nunca será exactamente la correcta en todos los casos, por lo que querrá permitir a los usuarios corregirla de todos modos si esto es visible para los usuarios.

+0

+1 Creo que esta es la mejor respuesta. El gerente de ubicación no puede saber cuándo recibió la ubicación más precisa. –

+1

Esta respuesta es correcta, pero pedante. Por supuesto, es imposible detectar cuándo una ubicación es tan buena como se va a encontrar (ver: detener el problema). Sin embargo, las personas aún desean obtener buenos datos con una compensación por tiempo y desean las mejores prácticas. Lo que OP deseaba era muy claro, y no era una conferencia. La respuesta de Evgen, arriba, es la más productiva. – tooluser

Cuestiones relacionadas