Actualmente estoy probando el modo de ubicación en segundo plano en iOS 13, ya que quiero seguir la ubicación y el movimiento del usuario (usando el CMMotionManager) en segundo plano. Por lo tanto, tengo mi propia clase (singleton) que maneja el seguimiento de ubicación. Inicializo CLLocationManager de la siguiente manera:
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
}
Entonces comienzo los siguientes servicios:
func startLocationServices() {
// ...
locationManager.startUpdatingLocation()
locationManager.startMonitoringVisits()
locationManager.startMonitoringSignificantLocationChanges()
// ...
}
Además, implementé los métodos CLLocationManagerDelegate-didChangeAuthorization (), didUpdateLocation ().
En el archivo info.plist agregué las siguientes entradas:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
En mi ViewController, llamo a startLocationServices. Actualmente, configuro la autorización de la aplicación para rastrear los datos de ubicación en ".authorizedAlways"
Las actualizaciones de ubicación se detienen después de aproximadamente 60 - 130 minutos.
Para resolver el problema, ya agregué la función didFinishLaunchingWithOptions, que activa las actualizaciones de ubicación nuevamente:
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
}
Cuando la aplicación se despertó usando esta función, logré obtener datos continuos en algunas pruebas, pero a veces la aplicación se suspendió nuevamente después de unos minutos.
Por último, también probé un temporizador que reinicia el seguimiento de ubicación cada 5 minutos, pero esto no parece afectar en absoluto la duración de la actualización.
Entonces, mi pregunta es si hay una forma de recibir continuamente las actualizaciones de ubicación en segundo plano, o ¿hay alguna opción que me falta?
Gracias por adelantado.
Editar: probé la aplicación en iOS 12 y obtiene actualizaciones continuas en 5/5 pruebas. Así que supongo que el problema está relacionado con iOS 13.