Frage

UPDATE: Ab iOS 5 und Xcode 4.1 ist nun möglich Lage im Simulator zu testen und sogar Routen definieren. Siehe http://developer.apple.com für weitere Details.

Legacy-Frage

Gibt es trotzdem Corelocation auf dem iPhone Simulator zu testen?

Alles, was ich verlangen, ist in der Lage, die Lage, mich zu setzen und haben Corelocation es zurück.

War es hilfreich?

Lösung 2

Vielen Dank für das tolle Feedback, hat es mich dazu veranlasst eine robuste Lösung zu finden.

Der Code kann alle hier gefunden werden:

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

Es ist sehr chaotisch, aber als ich es verwenden wird es viel besser geworden ist.

Die Lösung war CLLocationManager Unterklasse und einen neuen Delegaten @protocol, genannt DLocationManagerDelegate definieren.

Es ist so konzipiert, ein einfaches Drop-in-Ersatz für CLLocationManagerDelegate sein, die eine kompiliert auf sehr dünne Schicht, wenn auf einem Gerät eingesetzt werden.

Wenn auf dem Gerät ausgeführt wird es Daten als normal zurück CoreLocation verwenden, aber im Simulator wird es geografische Breite und Länge aus einer Textdatei (definiert in der DLocationManager.h-Datei) lesen.

Ich hoffe, das hilft, ist die Umsetzung auf der einfachen Seite und Sie müssen startUpdatingLocation und stopUpdatingLocation die Anzeige zu aktualisieren.

Kommentare und Anregungen dankbar empfangen werden.

Andere Tipps

Hier ist meine einfache Hack, die CLLocationMager zwingt zurückzukehren die geocoords von Powells Tech Buchhandlung nur auf dem Simulator:

#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

eine Filterfunktion Verwendung in einer Testinstanz tauschen, wenn auf dem Simulator ausgeführt wird. Überall dort, wo Sie zuvor die Lage (Delegierter Anruf, usw.) empfangen wird, führt es durch diese:

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

Speicherverwaltung Fragen beiseite ...

Ich denke, es ist eine andere (bessere IMHO) Ansatz, der hier als Subklassen CLLocationManager wie in

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

In ObjectiveC scheint es möglich zu sein, um ersetzen eine bestehende Methode aus einer Klasse, ohne sie zu überschreiben. Dies wird oft als „Methode Swizzling“ genannt. Sie Ihre eigene Kategorie für eine bestehende Klasse definieren ein ein vorhandenes Verfahren darin implementieren

Aus der Kundenperspektive, alles ist transparent: er das Gefühl hat, er mit dem realen CLLocationManager tun, aber tatsächlich, Sie „nahmen die Kontrolle von ihm“ . Damit er braucht nicht mit einer besonderen Unterklasse oder jedem speziellen Delegaten Protokoll zu behandeln. Er mit dem gleichen Klasse / Protokoll wie der von Corelocation hält

Hier ist ein Beispiel, die Kontrolle über die Delegierten würde injiziert ein Client nahm zu:

 
@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

Dann in dieser Implementierung sind Sie frei, mit einem vorher definierten Satz von Koordinaten zu behandeln (aus einer Datei von was auch immer), die „geschoben“ an die Delegaten mit dem Standard-Protokoll CLLocationManagerDelegate wird.

Trigger der Kern Standort Rückrufe von einer Testklasse, wenn Sie einen anderen Ort als dem man festlegen müssen den Simulator gibt Ihnen.

die Locationmanager: didUpdateToLocation und Location. DidFailedWithError überlastet Rückrufe werden nie im iPhone-Simulator genannt, das ist irgendwie seltsam, alles, was ich bekommen ist 0.0000 für lat und 0,0000 für lon. als die Position. In der Situation, etwas, das Sie entwickeln, das ist irgendwie schwer, alle möglichen Situationen zu implementieren, während der Standort Handhabung auftreten können, nur Simulator-Umgebung.

Wenn Sie bei der Aktualisierung des blauen userLocation Punktes in einem MKMapView mit dem simulierten Standort-Updates interessiert sind, überprüfen Sie heraus mein FTLocationSimulator unter http://github.com/futuretap/FTLocationSimulator

Es liest eine KML-Datei, die von Google Earth kontinuierlichen Standortaktualisierungen zur Verfügung zu stellen.

Testen Corelocation auf dem iPhone Simulator

1) Um die Lage im Simulator zu testen, bester Weg ist, GPX-Dateien zu verwenden, gehen Sie einfach auf Dateien -> Neu -> Ressource -.> GPX-Datei

2) Nach dem Hinzufügen der GPX-Datei des Ort zu aktualisieren, wie gewünscht Koordinaten.

3), sobald die GPX-Datei zum Projekt hinzugefügt wird, wählen Sie die Schema -> Schema bearbeiten -> Ausführen -> Lage Simulation zulassen .tick den Standort Simulation und wählen Sie den Namen der GPX-Datei Sie gerade erstellt haben.

Auf diese Weise Simulator wird immer Ihre gewünschten Koordinaten wählen, dass wir in unserer GPX-Datei hinzugefügt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top