Xcode / iOS-Simulator: Lösen Sie signifikante Standortänderungen manuell aus

77

Gibt es eine Möglichkeit, das Gerät manuell anzuweisen, eine wichtige Standortänderungsbenachrichtigung zu versenden, mit der alle für diese Benachrichtigung registrierten Anwendungen aktiviert werden? Dies dient nur zum Testen, und mir ist klar, dass dieser private API-Aufruf bei der Übermittlung an den App Store abgelehnt wird.

Nick
quelle
1
Ich habe die privaten Framework-Header durchgesehen und konnte nichts finden, was einem Auslöser dafür ähnelte. Es ist nicht bequem, dies nur zu testen, indem Sie ins Auto steigen und mit einem Laptop herumfahren.
Nick
1
Wenn Sie den CLLocationManager didUpdateToLocation: fromLocation: delegate verwenden, können Sie startUpdatingLocation anstelle von startMonitoringSignificantLocationChanges zu Testzwecken verwenden. Wenn im CLLocationManager kein Filter festgelegt ist, wird fast jede Sekunde didUpdateToLocation aufgerufen, wenn Sie einen mittelgroßen GPS-Empfang haben. Zu Testzwecken könnte dies helfen.
Thomas
1
Es geht nicht wirklich darum, die Ausgabe von CLLocationManager zu testen, sondern den Lebenszyklus der App, wenn sie durch eine signifikante Standortänderung "aufgeweckt" wird.
Nick
Wenn Sie ein Apple Dev-Konto haben, sollten Sie sich die iOS5-UIAutomation ansehen. Möglicherweise erhalten Sie eine Lösung. Die einzige Hürde ist, dass ich nicht weiß, ob Sie ein Programm über UIAutomation in den Hintergrundmodus versetzen können.
Barney Mattox
Mit FWIW Xcode können Ihre Apps nicht ordnungsgemäß angehalten werden, und Sie können unerwartete Ergebnisse erzielen . Das ist auf einem normalen Gerät, es würde tatsächlich ausgesetzt werden, aber da Sie durch Xcode laufen, würde es nur für Debugging-Zwecke im Hintergrund bleiben ...
Honey

Antworten:

192

Also zwei Antworten:

A) Steig in einen Zug :-)

B) Verwenden Sie den Simulator. Im iOS 5.x-Simulator gibt es ein Debug-Menü mit einem Standort-Untermenü. Wählen Sie Autobahn. Dies startet den Simulator auf einer imaginären Reise entlang der malerischen 280 in Nordkalifornien. Es bietet Ihnen alles außer der Ansicht: Ihre App erhält signifikante Standortänderungsaktualisierungen und wird auch im Hintergrund gestartet, wenn sie angehalten wurde.

Um zu überprüfen, ob Sie sich tatsächlich bewegen, starten Sie die Safari im Simulator, gehen Sie zu maps.google.com und klicken Sie auf die kleine Schaltfläche "Mein Standort verfolgen". Du solltest dich bewegen.

Genial! Wie kann nun das Lebenszyklusproblem beim Starten durch das System behoben werden? Einfach! Lassen Sie xCode warten, bis Ihre App gestartet wird, um mit dem Debuggen zu beginnen. Wählen Sie im Menü Schema die Option Schema bearbeiten. Wählen Sie im Ausführungsschema und auf der Registerkarte "Info" für die Einstellung "Starten" die Option " Warten Sie, bis My.app gestartet wird ".

Führen Sie Ihre App einmal im Simulator aus, damit die Überwachung auf Standortaktualisierungen beginnt, und erzwingen Sie dann das Beenden, damit sie angehalten wird. Das Hinzufügen eines Haltepunkts in Ihrer Anwendung hat die Startfunktion beendet und wartet. Sobald Ihr Simulator weit genug gegangen ist, wird Ihre Anwendung aufgeweckt, Ihr Haltepunkt erreicht und Sie sind im Geld.

Aber wirklich, die Zugfahrt macht mehr Spaß.

MagicSeth
quelle
2
Hat es jemand mit dem iOS 6.X Simulator versucht? Konnte es nicht zum Laufen bringen.
Segev
2
Kein Glück mit iOS 6.1 sim und XCode 4.6 für mich.
Stephen Petschulat
1
zu lange zu warten, siehe @ Chris Lösung
DanSkeel
3
iOS9.3 + xCode 7.3 Update: Diese Methode funktioniert wie ein Zauber !! (HINWEIS: Stellen Sie sicher, dass requestAlwaysAuthorization () + die entsprechenden info.plst-Schlüssel ordnungsgemäß verarbeitet werden.) Durch das Einstellen von distanceFilter = 500 erhielt ich außerdem alle 30-40 Sekunden (manchmal sogar ~ 15s) Standortaktualisierungen;)
Vexy
1
5 Jahre später. Funktioniert das noch mit XCode 9? Ich habe genau alles wie oben erwähnt gemacht. Ich habe ungefähr 5 Minuten gewartet. Nichts.
Dibzmania
18

Nun, ich habe festgestellt, dass ich dies tun kann, indem ich den Flugzeugmodus und / oder WiFi ein- und ausschalte. Starten Sie die App möglicherweise mit dem Gerät im Flugzeugmodus, schließen Sie die App und schalten Sie den Flugzeugmodus aus. Dadurch wird das GPS eingeschaltet und der Versand einer Standortaktualisierung erzwungen.

Chris
quelle
1
Dies hat bei mir nicht funktioniert, um eine terminierte App neu zu starten, die eine signifikante Überwachung von Standortänderungen verwendet.
Aslisabanci
1
Ja ! Das war eine sehr gute Idee! Mein Problem war, dass das System meine App startete, wenn das Gerät gesperrt war und diese "Flugzeugmodus" -Lösung unter iOS 9 wie ein Zauber funktionierte! Danke vielmals !
Nverinaud
4

Ich wollte auch den Relaunch meiner terminierten App testen, die eine signifikante Änderungsüberwachung verwendet. Ich habe einen Code geschrieben, damit eine lokale Benachrichtigung angezeigt wird, wenn er über einen Standortschlüssel im Wörterbuch für Startoptionen gestartet wird.

Ich habe meine App im Simulator ausgeführt. Dann tötete es aus der Multitasking-Leiste. Dann habe ich den Speicherort des iOS-Simulators auf einen benutzerdefinierten Speicherort festgelegt. Ich habe den Simulator verlassen und erneut gestartet. Meine App hat die signifikante Standortaktualisierung erhalten und die lokale Benachrichtigung angezeigt.

aslisabanci
quelle
3

Ich hatte mit dem gleichen Problem zu kämpfen, wie man 'startMonitoringSignificantLocationChanges' testet und prüft, ob meine App Standortaktualisierungen erhält, wenn sie angehalten wird.

Ich konnte die Ausführung an einem Haltepunkt nicht abfangen, aber ich konnte die Ergebnisse meiner Implementierung sehen, indem ich die neuen Standortdaten an den Server sendete.

Der gesamte Ablauf: - Implementiert mit 'startMonitoringSignificantLocationChanges' und einem API-Aufruf an meinen Server, um den Längen- und Breitengrad des Standorts zu aktualisieren. - Setzen Sie die Hintergrundmodusfunktion für Standortaktualisierungen auf true. - Führen Sie die App aus, damit der Standortmanager initiiert wird und die App wartet Standortänderungen - Das Schließen der App erzwingen - Debug-> Standort auf dem Simulator auf Autobahnantrieb setzen - Geöffnete Karten, um festzustellen, ob sich der Standort ändert - Auf dem Server auf Standortaktualisierungen gewartet und alle 3 Minuten neue Ergebnisse erhalten

Ich bin mir jedoch immer noch nicht sicher, ob dies auf einem realen Gerät ausreichend ist.

Ich arbeite an Xcode Version 6.0.1 (6A317). getestet auf Simulator iPhone 5s (8.0).

Bardh Lohaj
quelle
2

Wenn Sie dies zu MagicSeths Antwort hinzufügen und dies auf einem realen Gerät anstelle eines Simulators testen müssen, können Sie einen Hintergrundstart mit UIApplication.LaunchOptionsKey.locationSchlüssel auslösen, indem Sie die Ortungsdienste im Bildschirm Allgemein> Datenschutz in der App Einstellungen deaktivieren und wieder aktivieren.

Eugene Tulushev
quelle
Dies wäre ein besserer Kommentar als eine Antwort
Jodast
Ich konnte die Lösung mit dem Simulator nicht zum
Laufen bringen
1

Abhängig von Ihrem Szenario würde ich zwei Lösungen vorschlagen:

  1. Verwenden Sie einen Timer oder eine lokale Benachrichtigung, die regelmäßig stopMonitoringSignificantLocationChanges gefolgt von startMonitoringSignificantLocationChanges aufruft, wodurch ein neuer Speicherort ausgelöst werden soll, der an Ihren Code gesendet werden soll (möglicherweise derselbe Speicherort wie zuvor).

  2. Erstellen Sie Ihren eigenen GPS-Simulator, den Sie in Debug-Builds starten und der dieselben Delegatenmethoden aufruft wie CLLocationManager.

Splitter
quelle
Es gibt einen Anwendungslebenszyklus, der das Wesentliche der Frage ist.
Nick
Es gibt einen Anwendungslebenszyklus, der das Wesentliche der Frage ist. Die Anwendung wird beendet und durch die signifikante Standortänderung im Hintergrund gestartet. Wir müssen das Verhalten der Anwendung testen, sobald sie im Hintergrund gestartet wird, einschließlich Lebensdauer und Netzwerkkommunikation. Wir haben unsere Probleme gelöst, indem wir uns einen Tag Zeit genommen haben und mit einem Laptop durch die Stadt gefahren sind, der die Konsole auf Protokollierung der Aktivitäten überwacht.
Nick
1

Eine Sache, die mir in iOS 7 und Xcode 5.1.1 aufgefallen ist - Wenn Sie erwarten, dass SLC-Ereignisse Ihre App in den Hintergrundmodus starten, trifft sie möglicherweise die von Ihnen festgelegten Haltepunkte. Für mich wird die NSLog-Nachricht manchmal nicht einmal angezeigt.

In diesem Fall können Sie die NSLog-Ausgaben im Systemprotokoll anzeigen. Sie können das Systemprotokoll über das Debug-Menü von iOS Simulator öffnen.

Ke Sun.
quelle
0

In iOS 4 können Sie sich für wichtige Standortänderungen registrieren. Aus den Apple-Dokumenten: Mit diesem Dienst werden Standortaktualisierungen nur generiert, wenn sich der Standort des Benutzers erheblich ändert. Daher ist es ideal für soziale Anwendungen oder Anwendungen, die dem Benutzer unkritische, standortrelevante Informationen liefern. Wenn die Anwendung bei einem Update angehalten wird, wird sie vom System im Hintergrund aktiviert, um das Update durchzuführen. Wenn die Anwendung diesen Dienst startet und dann beendet wird, startet das System die Anwendung automatisch neu, wenn ein neuer Speicherort verfügbar wird. Dieser Dienst ist in iOS 4 und höher nur auf Geräten verfügbar, die ein Mobilfunkgerät enthalten.

Hier und hier finden Sie die Apple-Dokumente .

Hier ist ein Beispielcode für die Registrierung für Aktualisierungen des Signifikanzorts:

- (void)startSignificantChangeUpdates {

// Create the location manager if it doesn't exist
if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];

}}

In den Dokumenten heißt es: Wenn Sie diesen Dienst laufen lassen und Ihre Anwendung anschließend angehalten oder beendet wird, aktiviert der Dienst Ihre Anwendung automatisch, wenn neue Standortdaten eintreffen. Zum Zeitpunkt des Aufweckens wird Ihre Anwendung in den Hintergrund gestellt und erhält eine kleine Zeitspanne für die Verarbeitung der Standortdaten. Da sich Ihre Anwendung im Hintergrund befindet, sollte sie nur minimale Arbeit leisten und alle Aufgaben (z. B. das Abfragen des Netzwerks) vermeiden, die möglicherweise verhindern, dass sie vor Ablauf der zugewiesenen Zeit zurückkehrt. Ist dies nicht der Fall, wird Ihre Anwendung möglicherweise beendet.

Jane Sales
quelle
Danke ... Ich verstehe, wie es funktioniert und benutze es seit einiger Zeit. Die Frage ist, wie man es testet , ohne in einem Auto herumzufahren und das Gerät zum Auslösen zu bringen.
Nick
Oh, tut mir leid. Kann ich meine Antwort löschen?
Jane Sales
-1

Autobahnfahrt

Geben Sie hier die Bildbeschreibung ein

// MARK: - MKMapViewDelegate

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    guard let location = userLocation.location else { return }

    print(location.speed)
  }
onmyway133
quelle
-4

Dies ist nicht möglich, da der Anwendungsbereich auf den eigenen Bereich beschränkt ist und eine solche Benachrichtigung nicht mit der Liste der dokumentierten APIs von Apple generiert werden kann. Natürlich. Wenn eine undokumentierte API verwendet wird, wird die Anwendung aufgrund der Verwendung einer undokumentierten / privaten API von Apple abgelehnt.

Saurabh Passolia
quelle
Offensichtlich ... Bitte lesen Sie die Frage, bevor Sie antworten. "Dies dient nur zum Testen, und mir ist klar, dass dieser private API-Aufruf bei der Übermittlung an den App Store abgelehnt wird."
Nick