Estoy escribiendo una aplicación que requiere actualizaciones de ubicación en segundo plano con alta precisión y baja frecuencia . La solución parece ser una tarea NSTimer en segundo plano que inicia las actualizaciones del administrador de ubicación, que luego se apaga inmediatamente. Esta pregunta se ha hecho antes:
Obtener la ubicación del usuario cada n minutos después de que la aplicación pasa a segundo plano
iOS No es el problema típico del temporizador de seguimiento de ubicación en segundo plano
Temporizador de fondo de larga duración de iOS con modo de fondo de "ubicación"
Servicio en segundo plano de tiempo completo de iOS basado en el seguimiento de la ubicación
pero todavía tengo que conseguir un ejemplo mínimo que funcione. Después de probar cada permutación de las respuestas aceptadas anteriores, armé un punto de partida. Ingresando antecedentes:
- (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];
}
y el 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];
}
El comportamiento actual es que se backgroundTimeRemaining
reduce de 180 segundos a cero (mientras se registra la ubicación), y luego se ejecuta el controlador de vencimiento y no se generan más actualizaciones de ubicación. ¿Cómo modifico el código anterior para recibir actualizaciones periódicas de ubicación en segundo plano de forma indefinida ?
Actualización : estoy apuntando a iOS 7 y parece haber alguna evidencia de que las tareas en segundo plano se comportan de manera diferente:
Inicie el Administrador de ubicaciones en iOS 7 desde la tarea en segundo plano