Kontinuierliche Standortaktualisierung Hintergrund iOS13

8

Ich teste derzeit den Hintergrund-Standortmodus in iOS 13, da ich den Standort und die Bewegung des Benutzers (mithilfe des CMMotionManager) im Hintergrund verfolgen möchte. Daher habe ich meine eigene (Singleton-) Klasse, die die Standortverfolgung übernimmt. Ich initialisiere den CLLocationManager folgendermaßen:

    func initializeLocationManager() -> CLLocationManager {
        let manager = locationManager ?? CLLocationManager()
        manager.delegate = self
        manager.requestAlwaysAuthorization()
        manager.allowsBackgroundLocationUpdates = true
        manager.pausesLocationUpdatesAutomatically = false
        manager.distanceFilter = kCLDistanceFilterNone
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.activityType = .other
        return manager
    }

Dann starte ich folgende Dienste:

   func startLocationServices() {
        // ...
        locationManager.startUpdatingLocation()
        locationManager.startMonitoringVisits()
        locationManager.startMonitoringSignificantLocationChanges()
        // ...
    }

Außerdem habe ich die CLLocationManagerDelegate-Methoden didChangeAuthorization (), didUpdateLocation () implementiert.

In der info.plist-Datei habe ich folgende Einträge angehängt:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array> 

In meinem ViewController rufe ich die startLocationServices auf. Derzeit habe ich die Berechtigung der App zum Verfolgen von Standortdaten auf ".authorizedAlways" gesetzt.

Die Standortaktualisierungen werden nach ca. 60 - 130 Minuten beendet.

Um das Problem zu lösen, habe ich bereits die Funktion didFinishLaunchingWithOptions hinzugefügt, die die Standortaktualisierungen erneut auslöst:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let launchOptions = launchOptions,
        let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
        isLocationKey {
        restartServices()

    }
    return true
} 

Wenn die App mit dieser Funktion geweckt wird, konnte ich bei einigen Tests fortlaufende Daten abrufen, aber manchmal wurde die App nach einigen Minuten wieder angehalten.

Zuletzt habe ich auch einen Timer ausprobiert, der die Standortverfolgung alle 5 Minuten neu startet, aber dies scheint die Aktualisierungsdauer überhaupt nicht zu beeinflussen.

Meine Frage ist also, ob es eine Möglichkeit gibt, die Standortaktualisierungen kontinuierlich im Hintergrund zu erhalten, oder ob mir eine Option fehlt?

Danke im Voraus.

Bearbeiten: Ich habe die Anwendung unter iOS 12 getestet und sie wird in 5/5-Tests kontinuierlich aktualisiert. Ich denke, das Problem hängt mit iOS 13 zusammen.

mattll
quelle
1
Hey, hast du die Lösung dafür bekommen?
Abhishek
2
Wie in meinem letzten Kommentar erwähnt, könnte ich die Dauer, bevor die Anwendung in den angehaltenen Zustand versetzt wird, drastisch verlängern, indem ich den Ressourcenverbrauch im Hintergrund reduziere. -> Ich habe die Bewegungssammlung komplett aus der App entfernt. -> Wenn ich in den Hintergrund wechsle, verringere ich die Genauigkeit und erhöhe den Distanzfilter für Standorte, um weniger Ereignisse zu erhalten. Ich stoppe einige Aufgaben, die die Benutzeroberfläche aktualisieren. Ich probiere die Sammlung anderer Datenquellen herunter. Ich exportiere meine Daten nicht im Hintergrund oder andere Arbeitsbelastung. So, jetzt bekomme ich ungefähr 3000 Minuten im Hintergrund.
Mattll
Kannst du mir mit etwas Code helfen?
Abhishek
1
Implementieren Sie in AppDelegate.swift die Funktionen func applicationDidEnterBackground (_ application: UIApplication) und func applicationDidEnterBackground (_ application: UIApplication). Greifen Sie in diesen Funktionen auf Ihren CLLocationManager zu und stellen Sie die Eigenschaften distanceFilter, gewünschte Genauigkeit entsprechend ein. Ich setze auch meinen Timer herunter, mit dem ich einige Nutzungsinformationen (wie den aktuellen Batteriestatus) schreibe, und beende einen Timer, mit dem ich die Hauptansicht regelmäßig aktualisiere oder umgekehrt, wenn die applicationDidBecomeActive-Methode verwendet wird. Ich denke, herumspielen und testen ist der Schlüssel.
Mattll

Antworten:

1

Mit Code ist nichts falsch !! Ich habe das gleiche Problem und nach Recherchen fand ich das

Auf der WWDC19-Keynote kündigte Apple zwei Änderungen an der Funktionsweise von Standortberechtigungen in iOS 13 an. Mit der ersten Änderung können Benutzer ihren Standort nur einmal für Ihre App freigeben. Dies erleichtert das Ausprobieren von Standortfunktionen und hilft Benutzern, vertrauliche Standortdaten privat zu halten.

Die erste bemerkenswerte Änderung besteht darin, dass requestAlwaysAuthorizationder Benutzer selbst beim Anrufen nur die Optionen "Gerade jetzt" und "Bei Verwendung" im Berechtigungsdialog erhält. Wenn der Benutzer Ihnen die Berechtigung "Bei Verwendung" erteilt und Sie versuchen, nach einem Speicherort im Hintergrund zu suchen, wird dem Benutzer nur ein Dialogfeld zum Erteilen der Hintergrundberechtigung angezeigt.

Wenn also Nutzer gewährt WhenInUseUsage Erlaubnis erhalten Sie alwaysin CLAuthorizationStatusund Wenn der Benutzer wählen , Allow Once CLAuthorizationStatuswird ausgeruht notDeterminedwieder einmal App startet

In diesem Artikel finden Sie detaillierte Informationen unter https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889

Und hier ist das Video https://developer.apple.com/videos/play/wwdc2019/705/

BEARBEITEN

After When In User-Berechtigung, die vom Benutzer erteilt wurde iOS zeigt dem Benutzer nach einigen Tagen einen weiteren Dialog an, um die Berechtigung von der Verwendung zu ändern, um sie immer zuzulassen.

Daher gibt es jetzt keine Möglichkeit, den Benutzer direkt um eine sofortige Erlaubnis zu bitten, wie wir es zuvor getan haben.

Geben Sie hier die Bildbeschreibung ein

Prashant Tukadiya
quelle
1
Hat das Ihr Problem gelöst? Ich habe die Berechtigungsstufe manuell auf immer in -> Einstellungen -> Datenschutz -> Ortungsdienste eingestellt. Damit wurde das Problem jedoch nicht behoben.
Mattll
1
Aber selbst nachdem ich das Flag "Immer zulassen" gesetzt habe, wird die Anwendung irgendwann beendet. Läuft Ihre App danach kontinuierlich?
Mattll
1
Danke für das Update. Ich bin bereits auf dieses Popup gestoßen, und Sie können die Benachrichtigungen immer in den Einstellungen für den iPhone-Datenschutz festlegen, aber das oben beschriebene Problem wird dadurch für mich nicht gelöst. Unter iOS 12 hatte ich noch keine Probleme mit der kontinuierlichen Standortverfolgung, während unter iOS 13 die App nach einer Weile angehalten wird.
Mattll
1
Hier sind meine Beobachtungen, nachdem ich das Problem über einige Zeit untersucht habe. In kurzen Worten: Je weniger ich im Hintergrund mache, desto länger kann ich bis zur Suspendierung aufnehmen. Ich habe die meisten Funktionen, die im Hintergrund ausgeführt wurden, deaktiviert, daher verfolge ich vorerst nur den Standort / einige Nutzungsinformationen und speichere sie unter Verwendung von Kerndaten. Wenn die Anwendung in den Hintergrundmodus wechselt, ändere ich außerdem den Distanzfilter und die gewünschte Genauigkeit des Standortmanagers. Jetzt kann ich ungefähr 3000 verfolgen, ohne suspendiert zu werden.
Mattll
1
Hat jemand diese Lösung bekommen?
Abhishek