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.
Respostas:
Nada está errado com o código !! , Enfrentei o mesmo problema e, após pesquisas, descobri que
Na palestra WWDC19, a Apple anunciou duas mudanças na maneira como as permissões de localização funcionarão no iOS 13. A primeira alteração oferece aos usuários a opção de compartilhar sua localização com seu aplicativo apenas uma vez. Isso facilita a experimentação dos recursos de localização e ajuda os usuários a manter privados os dados de localização confidenciais.
A primeira mudança notável é que, mesmo quando você liga
requestAlwaysAuthorization
, o usuário recebe apenas as opções 'agora' e 'quando em uso' na caixa de diálogo de permissão. Se o usuário conceder a permissão 'quando estiver em uso' e você tentar procurar a localização em segundo plano, somente o usuário receberá uma caixa de diálogo para conceder a permissão em segundo plano.Então, quando usuário concede WhenInUseUsage permissão Você receberá
always
noCLAuthorizationStatus
e Se o usuário escolherAllow Once
CLAuthorizationStatus
vai estar descansado paranotDetermined
uma vez lançamentos aplicativo novamenteVocê pode verificar este artigo para obter informações detalhadas https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889
E aqui está o vídeo https://developer.apple.com/videos/play/wwdc2019/705/
EDITAR
Após a entrada do usuário, a permissão concedida pelo usuário O iOS mostrará ao usuário outra caixa de diálogo após alguns dias para alterar a permissão de quando em uso para sempre permitir.
Portanto, agora não há como solicitar diretamente ao usuário sempre permitir permissão instantaneamente, como antes.
fonte