Testing Corelocation auf dem iPhone Simulator
-
03-07-2019 - |
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.
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.