Atualmente, estou testando o modo de localização em segundo plano no iOS 13, pois desejo rastrear a localização e o movimento do usuário (usando o CMMotionManager) em segundo plano. Portanto, eu tenho minha própria classe (singleton) manipulando o rastreamento de local. Eu inicializo o CLLocationManager da seguinte maneira:
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
}
Então inicio os seguintes serviços:
func startLocationServices() {
// ...
locationManager.startUpdatingLocation()
locationManager.startMonitoringVisits()
locationManager.startMonitoringSignificantLocationChanges()
// ...
}
Além disso, implementei os métodos CLLocationManagerDelegate didChangeAuthorization (), didUpdateLocation ().
No arquivo info.plist, anexei as seguintes entradas:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
No meu ViewController, chamo de startLocationServices. Atualmente, defino a autorização do aplicativo para rastrear os dados de localização como ".authorizedAlways"
As atualizações do local são interrompidas após aproximadamente 60 a 130 minutos.
Para resolver o problema, eu já adicionei a função didFinishLaunchingWithOptions, que aciona as atualizações de local novamente:
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
}
Quando o aplicativo é despertado usando essa função, eu consigo obter dados contínuos em alguns testes, mas às vezes o aplicativo é suspenso novamente após alguns minutos.
Por fim, também tentei um timer que reinicia o rastreamento de local a cada 5 minutos, mas isso não parece afetar a duração da atualização.
Portanto, minha pergunta é se existe uma maneira de receber continuamente as atualizações de localização em segundo plano ou se há alguma opção que esteja faltando?
Desde já, obrigado.
Editar: testei o aplicativo no iOS 12 e ele recebe atualizações contínuas em 5/5 testes. Acho que o problema está relacionado ao iOS 13.