ejecutar la aplicación continuamente en segundo plano

Quiero que mi aplicación siga funcionando en segundo plano con services de location. Para esto he usado:

-(void)applicationDidEnterBackground:(UIApplication *)application { [locationManager stopUpdatingLocation]; [locationManager startUpdatingLocation]; //timer=[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(UpdateLocation) userInfo:nil repeats:YES]; } 

pero cuando uso NSTimer no llama a UpdateLocation . Intenté llamarlo usando otro método pero luego también lo llamé solo una vez.

Quiero ejecutar la aplicación continuamente en segundo plano, detectando ubicaciones después de un intervalo regular de time.

Hice esto en una aplicación que estoy desarrollando. Los timeres no funcionan cuando la aplicación está en segundo plano, pero la aplicación recibe constantemente las actualizaciones de location. Leí en algún lugar de la documentation (no puedo encontrarlo ahora, publicaré una actualización cuando lo hago) que un método se puede llamar 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 necesitas crear el tuyo propio para que funcione. [No estoy seguro si esta es la explicación correcta, pero así es como entendí de lo que leo]

En primer lugar, agregue el object 'location' para la key 'Modos de background' en el file info.plist de su aplicación. Ahora, lo que debe hacer es iniciar las actualizaciones de location 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, escriba un método para manejar las actualizaciones de location, digamos – (void) didUpdateToLocation: location (CLLocation *), en el delegado de la aplicación. A continuación, implemente el método locationManager: didUpdateLocation: fromLocation de CLLocationManagerDelegate en la class en la que inició el administrador de location (ya que configuramos el delegado del administrador de location en 'self'). Dentro de este método, debe verificar si ha transcurrido el intervalo de time después del cual debe manejar las actualizaciones de location. Puede hacer esto guardando la hora actual cada vez. Si ese time ha transcurrido, llame al método UpdateLocation desde su 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 shanetworkingApplication].delegate didUpdateToLocation:newLocation]; [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp]; } } } 

Esto llamará a su método cada 5 minutos, incluso cuando su aplicación esté en segundo plano. Imp: esta implementación drena la batería, si la precisión de su location no es crítica, debe usar [locationManager startMonitoringSignificantLocationChanges]

Antes de agregar esto a su aplicación, lea la Guía de progtwigción de sensibilización de location en http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html

Sé que es muy tarde para una respuesta. Pero si aún no tienes la respuesta, aquí está lo que hice y mi aplicación continua en segundo plano.

 - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication *app = [UIApplication shanetworkingApplication]; UIBackgroundTaskIdentifier bgTask = 0; backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; } 

Ahora haz lo que quieras en el método backgroundTask .

Puede usarla para ejecutar aplicaciones en segundo plano para tareas particulares.

 - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication *app = [UIApplication shanetworkingApplication]; UIBackgroundTaskIdentifier bgTask = 0; backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; }