Lo hice en una aplicación que estoy desarrollando. Los temporizadores no funcionan cuando la aplicación está en segundo plano, pero la aplicación recibe constantemente las actualizaciones de ubicación. Leí en algún lugar de la documentación (parece que no puedo encontrarlo ahora, publicaré una actualización cuando lo hago) que un método puede invocarse solo en un ciclo de ejecución activo cuando la aplicación está en segundo plano. El delegado de la aplicación tiene un bucle de ejecución activo incluso en el bg, por lo que no es necesario que crees el tuyo para que esto funcione. [No estoy seguro si esta es la explicación correcta, pero así es como entiendo por lo que leo]
Antes que nada, agregue el objeto 'ubicación' para la clave 'Modos de fondo' en la aplicación de info.plist. Ahora, lo que hay que hacer es empezar las actualizaciones de ubicación en cualquier lugar de su aplicación:
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;//or whatever class you have for managing location
[locationManager startUpdatingLocation];
A continuación, escribir un método para manejar las actualizaciones de ubicación, dicen - (void) didUpdateToLocation: (CLLocation *) ubicación, en el delegado de la aplicación. A continuación, implemente el método locationManager: didUpdateLocation: fromLocation de CLLocationManagerDelegate en la clase en la que inició el administrador de ubicaciones (ya que configuramos el delegado del administrador de ubicaciones en 'self'). Dentro de este método, debe verificar si ha transcurrido el intervalo de tiempo después del cual debe manejar las actualizaciones de ubicación. Puede hacer esto guardando la hora actual cada vez. Si ha transcurrido ese tiempo, llame al método UpdateLocation del delegado de la aplicación:
NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;
int locationUpdateInterval = 300;//5 mins
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {
lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];
if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
//NSLog(@"New Location: %@", newLocation);
[(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
[userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
}
}
}
Esto le llame a su método cada 5 minutos, incluso cuando su aplicación está en segundo plano. Imp: Esta aplicación drena la batería, si la precisión de sus datos de localización no es crítico que debe utilizar [locationManager startMonitoringSignificantLocationChanges]
Antes de añadir esto a su aplicación, por favor lea la Guía de programación de Conocimiento de ubicación en http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html
Si no me equivoco, esto sólo llamar didUpdateToLocation cada 5 minutos si didUpdateLocation se llama a intervalos regulares pequeños. Si selecciona startMonitoringSignificantChanges y no se mueve mucho, no obtendrá actualizaciones en un intervalo de 5 minutos. ¿Correcto? – Lolo