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.