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.
77
Antworten:
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ß.
quelle
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.
quelle
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.
quelle
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).
quelle
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.location
Schlüssel auslösen, indem Sie die Ortungsdienste im Bildschirm Allgemein> Datenschutz in der App Einstellungen deaktivieren und wieder aktivieren.quelle
Abhängig von Ihrem Szenario würde ich zwei Lösungen vorschlagen:
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).
Erstellen Sie Ihren eigenen GPS-Simulator, den Sie in Debug-Builds starten und der dieselben Delegatenmethoden aufruft wie CLLocationManager.
quelle
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.
quelle
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.
quelle
Autobahnfahrt
// MARK: - MKMapViewDelegate func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { guard let location = userLocation.location else { return } print(location.speed) }
quelle
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.
quelle