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.
Antworten:
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
requestAlwaysAuthorization
der 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
always
inCLAuthorizationStatus
und Wenn der Benutzer wählen ,Allow Once
CLAuthorizationStatus
wird ausgeruhtnotDetermined
wieder einmal App startetIn 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.
quelle