Domanda

AGGIORNAMENTO: A partire da iOS 5 e Xcode 4.1 è ora possibile testare la posizione nel simulatore e persino definire percorsi. Vedi http://developer.apple.com per maggiori dettagli.

Domanda legacy

Esiste un modo per testare CoreLocation su iPhone Simulator?

Tutto ciò di cui ho bisogno è essere in grado di impostare personalmente la posizione e far sì che CoreLocation la restituisca.

È stato utile?

Soluzione 2

Grazie per l'ottimo feedback, mi ha spinto a trovare una soluzione solida.

Tutto il codice può essere trovato qui:

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

È molto disordinato ma man mano che lo uso sarà molto meglio.

La soluzione era sottoclassare CLLocationManager e definire un nuovo delegato @protocol , chiamato DLocationManagerDelegate .

È progettato per essere un semplice sostituto drop-in per CLLocationManagerDelegate che si compila fino a un livello molto quando viene distribuito su un dispositivo reale.

Durante l'esecuzione sul dispositivo restituirà i dati normalmente utilizzando CoreLocation , ma nel simulatore leggerà latitudine e longitudine da un file di testo (definito nel file DLocationManager.h).

Spero che questo sia d'aiuto, l'implementazione è semplice e devi aggiornare startUpdatingLocation e stopUpdatingLocation per aggiornare il display.

Commenti e feedback saranno ricevuti con gratitudine.

Altri suggerimenti

Ecco il mio semplice trucco che forza il ritorno di CLLocationMager i geocoord del Tech Bookstore di Powell solo sul simulatore:

#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

Utilizzare una funzione di filtro per scambiare un'istanza di prova quando si esegue sul simulatore. Ovunque tu abbia precedentemente ricevuto la posizione (chiamata delegata, ecc.), Passala attraverso questo:

+ (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
}

Problemi di gestione della memoria a parte ...

Penso che ci sia un altro approccio (migliore IMHO) qui rispetto alla sottoclasse di CLLocationManager come in

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

In ObjectiveC sembra possibile sostituire un metodo esistente da una classe senza sovrascriverlo. Questo è spesso chiamato "metodo swizzling" : definisci la tua categoria per una classe esistente e implementa un metodo esistente in essa.

Dal punto di vista del cliente, tutto è trasparente: ha la sensazione di avere a che fare con il vero CLLocationManager ma in realtà, tu " ne hai preso il controllo " . In modo che non abbia bisogno di occuparsi di alcuna sottoclasse speciale o di alcun protocollo delegato speciale: continua a utilizzare la stessa classe / protocollo di quella di CoreLocation.

Ecco un esempio per assumere il controllo sul delegato che un client inietterebbe:

 
@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

Quindi, in questa implementazione, sei libero di occuparti di un insieme predefinito di coordinate (proveniente da un file di qualunque cosa) che sarà "spinto". al delegato utilizzando il protocollo CLLocationManagerDelegate standard.

Attiva i callback di posizione principale da una classe di test, se devi impostare una posizione diversa da quella fornita dal simulatore.

il locationManager: didUpdateToLocation e locationManager: didFailedWithError i callback sovraccarichi non vengono mai chiamati nel simulatore di iphone, è un po 'strano, tutto ciò che ottengo è 0,0000 per lat. e 0,0000 per lon. come posizione. Nella situazione in cui sviluppi qualcosa, è difficile implementare tutte le possibili situazioni che possono verificarsi durante la gestione della posizione, utilizzando solo l'ambiente di simulazione.

Se sei interessato ad aggiornare il punto blu UserLocation in un MKMapView con gli aggiornamenti di posizione simulati, dai un'occhiata al mio FTLocationSimulator su http://github.com/futuretap/FTLocationSimulator

Legge un file KML generato da Google Earth per fornire continui aggiornamenti di posizione.

Test di CoreLocation su iPhone Simulator

1) Per testare la posizione nel simulatore, il modo migliore è usare i file GPX, basta andare su File - > Nuovo - > Risorsa - > File GPX.

2) Dopo aver aggiunto il file GPX, aggiornare le coordinate della posizione come desiderato.

3) una volta aggiunto il file GPX al progetto, seleziona lo schema - > Modifica schema - > Esegui - > Consenti simulazione posizione . Seleziona la simulazione posizione e seleziona il nome del file GPX che hai appena creato.

in questo modo il simulatore sceglierà sempre le coordinate desiderate, che abbiamo aggiunto nel nostro file GPX.

 Crea il file GPX

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top