Pregunta

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. Consulte http://developer.apple.com para obtener más detalles.

Pregunta heredada

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

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

¿Fue útil?

Solución 2

Gracias por los excelentes comentarios, me ha pedido que encuentre 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 subclase CLLocationManager y definir un nuevo delegado @protocol , llamado DLocationManagerDelegate .

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

Cuando se ejecuta en el dispositivo, devolverá los datos normalmente utilizando CoreLocation , pero en el simulador leerá la latitud y longitud de 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.

Los comentarios y opiniones se recibirán con gratitud.

Otros consejos

Aquí está mi simple truco que obliga a CLLocationMager a regresar los geocoords de Powell's Tech Bookstore 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

Use una función de filtrado para intercambiar una instancia de prueba cuando se ejecute en el simulador. Dondequiera que haya recibido previamente la ubicación (llamada delegada, etc.), pásela a través de 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
}

Aparte de los problemas de gestión de la memoria ...

Creo que hay otro enfoque (mejor IMHO) aquí que la subclase de CLLocationManager como en

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

En ObjectiveC parece que es posible reemplazar un método existente de una clase sin anularlo. Esto a menudo se llama " método swizzling " : usted 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á lidiando con el CLLocationManager real, pero en realidad, tomó el control de él " . Para que no tenga que lidiar con ninguna subclase especial o cualquier protocolo de delegado especial: sigue usando la misma clase / protocolo que el de CoreLocation.

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

 
@implementation CLLocationManager (simulator) 

-(void) setDelegate:(id)delegate { //your own implementation of the setDelegate... } -(id)delegate { //your own implementation of the delegate.... } -(void)startUpdatingLocation { } -(void)stopUpdatingLocation { } //.... //same for the rest of any method available in the standard CLLocationManager @end

Luego, en esta implementación, eres libre de lidiar con un conjunto de coordenadas predefinidas (provenientes de un archivo de lo que sea) que serán " puestas " al delegado utilizando el protocolo estándar CLLocationManagerDelegate .

Active las devoluciones de llamada de la ubicación central de una clase de prueba, si necesita establecer una ubicación diferente a la que le ofrece el simulador.

el locationManager: didUpdateToLocation y locationManager: didFailedWithError las devoluciones de llamada sobrecargadas nunca se llaman en el simulador de iPhone, eso es un poco extraño, todo lo que recibo es 0.0000 para lat., y 0.0000 para lon. como la posición. En la situación en la que desarrolla algo, es un poco difícil implementar todas las situaciones posibles que pueden ocurrir durante el manejo de la ubicación, utilizando 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, visite mi FTLocationSimulator en http://github.com/futuretap/FTLocationSimulator

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

Probando 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 agrega al proyecto, seleccione el esquema - > Esquema de edición - > Ejecutar - > Permitir simulación de ubicación: seleccione la simulación de ubicación y seleccione el nombre del archivo GPX que acaba de crear.

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

 Crea el archivo GPX

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top