Estou escrevendo um aplicativo que requer atualizações de localização em segundo plano com alta precisão e baixa frequência . A solução parece ser uma tarefa NSTimer em segundo plano que inicia as atualizações do gerenciador de localização, que então é encerrada imediatamente. Esta pergunta já foi feita antes:
Como obtenho uma atualização de localização em segundo plano a cada n minutos em meu aplicativo iOS?
Obter a localização do usuário a cada n minutos após o aplicativo entrar em segundo plano
iOS Não é o problema típico de cronômetro de rastreamento de localização em segundo plano
Temporizador de fundo de longa duração do iOS com modo de fundo "local"
Serviço de segundo plano em tempo integral iOS com base no rastreamento de localização
mas ainda tenho que fazer um exemplo mínimo funcionar. Depois de tentar todas as permutações das respostas aceitas acima, montei um ponto de partida. Inserindo fundo:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
e o método delegado:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
O comportamento atual é que os backgroundTimeRemaining
decréscimos de 180 segundos para zero (durante o registro do local) e, em seguida, o manipulador de expiração é executado e nenhuma outra atualização de local é gerada. Como modifico o código acima para receber atualizações periódicas de localização em segundo plano indefinidamente ?
Atualização : estou visando o iOS 7 e parece haver alguma evidência de que as tarefas em segundo plano se comportam de maneira diferente:
Inicie o Location Manager no iOS 7 a partir da tarefa em segundo plano