Prueba CoreLocation en iPhone Simulator

ACTUALIZACIÓN: A partir de iOS 5 y Xcode 4.1 ahora es posible probar la ubicación en el simulador e incluso definir rutas. Ver http://developer.apple.com para más detalles.

Pregunta Legacy

¿Hay alguna forma de probar CoreLocation en el simulador de iPhone?

Todo lo que necesito es poder establecer la ubicación yo mismo y hacer que CoreLocation la devuelva.

Aquí está mi truco simple que obliga al CLLocationMager a devolver los geocoords de Tech Bookstore de Powell solo en el simulador:

#ifdef TARGET_IPHONE_SIMULATOR @interface CLLocationManager (Simulator) @end @implementation CLLocationManager (Simulator) -(void)startUpdatingLocation { CLLocation *powellsTech = [[[CLLocation alloc] initWithLatitude:45.523450 longitude:-122.678897] autorelease]; [self.delegate locationManager:self didUpdateToLocation:powellsTech fromLocation:powellsTech]; } @end #endif // TARGET_IPHONE_SIMULATOR 

Gracias por los excelentes comentarios, me ha llevado a buscar una solución sólida.

Todo el código se puede encontrar aquí:

http://code.google.com/p/dlocation/

Es muy desordenado, pero a medida que lo use será mucho mejor.

La solución fue CLLocationManager subclase CLLocationManager y definir un nuevo delegado @protocol , llamado DLocationManagerDelegate .

Está diseñado para ser un simple reemplazo CLLocationManagerDelegate para CLLocationManagerDelegate que se comstack en una capa muy delgada cuando se implementa en un dispositivo real.

Cuando se ejecuta en el dispositivo, devolverá datos de forma normal utilizando CoreLocation , pero en el simulador leerá latitud y longitud desde un archivo de texto (definido en el archivo DLocationManager.h).

Espero que esto ayude, la implementación es simple y tienes que startUpdatingLocation y stopUpdatingLocation para actualizar la pantalla.

Comentarios y comentarios serán recibidos con gratitud.

Use una función de filtrado para intercambiar una instancia de prueba cuando se ejecuta en el simulador. Dondequiera que haya recibido previamente la ubicación (llamada de delegado, etc.), páselo por esto:

 + (CLLocation *) wakkawakka: (CLLocation*) loc { #ifdef TARGET_IPHONE_SIMULATOR /* replace with a test instance */ return [[CLLocation alloc] initWithLatitude:10.0 longitude:20.0]; #else return loc; #endif } 

Problemas de administración de memoria a un lado …

Creo que hay otro enfoque (mejor en mi humilde opinión) que subclasificar CLLocationManager como en

http://code.google.com/p/dlocation/

En ObjectiveC parece posible reemplazar un método existente de una clase sin anularlo. Esto a menudo se denomina “fusión de métodos”: define su propia categoría para una clase existente e implementa un método existente en ella.

Desde la perspectiva del cliente, todo es transparente: tiene la sensación de que está tratando con el verdadero CLLocationManager pero en realidad, “le CLLocationManager el control” . De modo que no necesita tratar con ninguna subclase especial o ningún protocolo de delegado especial: sigue usando la misma clase / protocolo que la de CoreLocation.

Aquí hay un ejemplo para tomar el control sobre el delegado que un cliente inyectaría:

@implementation CLLocationManager (simulator) 

@implementation CLLocationManager (simulator)

– (void) setDelegate: (id) delegate {
// su propia implementación de setDelegate …
}
– (id) delegado {
// tu propia implementación del delegado …
}
– (void) startUpdatingLocation {
}
– (void) stopUpdatingLocation {
}
//
// lo mismo para el rest de cualquier método disponible en el CLLocationManager estándar
@fin

Luego, en esta implementación, puede tratar con un conjunto de coordenadas predefinidas (provenientes de un archivo de lo que sea) que serán “enviadas” al delegado utilizando el protocolo estándar CLLocationManagerDelegate .

Desencadena las devoluciones de llamadas de una clase de prueba, si necesitas establecer una ubicación distinta a la que te da el simulador.

el LocationManager: didUpdateToLocation y locationManager: didFailedWithError callbacks sobrecargados nunca se llaman en el simulador de iphone, eso es un poco extraño, todo lo que obtengo es 0.0000 para lat., y 0.0000 para lon. como la posición. En la situación en la que desarrolle algo, es difícil implementar todas las situaciones posibles que pueden ocurrir durante el manejo de la ubicación, usando solo el entorno del simulador.

Si está interesado en actualizar el punto de ubicación de usuario azul en un MKMapView con las actualizaciones de ubicación simuladas, consulte mi FTLocationSimulator en http://github.com/futuretap/FTLocationSimulator

Lee un archivo KML generado por Google Earth para proporcionar actualizaciones de ubicación continuas.

Prueba CoreLocation en iPhone Simulator

1) Para probar la ubicación en el simulador, la mejor manera es usar archivos GPX, solo vaya a Archivos -> Nuevo -> Recurso -> Archivo GPX.

2) Después de agregar el archivo GPX, actualice las coordenadas de ubicación como desee.

3) una vez que el archivo GPX se haya agregado al proyecto, seleccione el esquema -> Editar esquema -> Ejecutar -> Permitir simulación de ubicación .pulse la simulación de ubicación y seleccione el nombre del archivo GPX que acaba de crear.

de esta manera, el simulador siempre seleccionará las coordenadas deseadas que hayamos agregado en nuestro archivo GPX.

Crea el archivo GPX