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.
Respuestas:
¡Nada está mal con el código! , Me he enfrentado al mismo problema y después de la investigación descubrí que
En la conferencia magistral de WWDC19, Apple anunció dos cambios en la forma en que funcionarán los permisos de ubicación en iOS 13. El primer cambio brinda a los usuarios la opción de compartir su ubicación con su aplicación solo una vez. Esto hace que sea más fácil probar las características de ubicación y ayuda a los usuarios a mantener privados los datos confidenciales de ubicación.
El primer cambio notable es que, incluso cuando llame
requestAlwaysAuthorization
, el usuario solo obtendrá las opciones 'justo ahora' y 'cuando esté en uso' en el cuadro de diálogo de permisos. Si el usuario le otorga el permiso "cuando está en uso" e intenta buscar una ubicación en segundo plano, solo entonces se le presentará un cuadro de diálogo para otorgar el permiso de fondo.Por eso, cuando las subvenciones usuario WhenInUseUsage de permiso que obtendrán
always
enCLAuthorizationStatus
y Si el usuario eligeAllow Once
CLAuthorizationStatus
serán descansado anotDetermined
la vez lanza una aplicación de nuevoPuede consultar este artículo para obtener información detallada https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889
Y aquí está el video https://developer.apple.com/videos/play/wwdc2019/705/
EDITAR
Después, cuando en el usuario, el permiso otorgado por el usuario iOS mostrará al usuario otro diálogo después de algunos días para cambiar el permiso de cuando está en uso para permitir siempre.
Por lo tanto, ahora no hay forma de pedirle directamente al usuario que siempre permita el permiso instantáneamente como lo hicimos antes.
fuente