iphone ios nstimer uiapplicationdelegate

iphone - ¿NSTimer programado cuando la aplicación está en segundo plano?



ios uiapplicationdelegate (8)

Cuando está en el fondo, este temporizador obviamente no dispara

Esta publicación sugiere que las cosas no son tan claras como eso. Debe invalidar sus temporizadores a medida que su aplicación entra en segundo plano y reiniciarlos cuando vuelva al primer plano. Ejecutar cosas mientras estás en el fondo podría ser posible, pero una vez más podría matarte ...

Puede encontrar una buena documentación sobre el enfoque multitarea de iOS here .

¿Cómo manejan las personas un NSTimer programado cuando una aplicación está en segundo plano?

Digamos que actualizo algo en mi aplicación cada hora.

updateTimer = [NSTimer scheduledTimerWithTimeInterval:60.0*60.0 target:self selector:@selector(updateStuff) userInfo:nil repeats:YES];

Cuando está en segundo plano, este temporizador obviamente no se dispara (?). ¿Qué debería pasar cuando el usuario vuelve a la aplicación ...? ¿El temporizador sigue funcionando, con los mismos tiempos?

Y qué pasaría si el usuario regresa en más de una hora. ¿Se disparará por todas las veces que se perdió, o esperará hasta la próxima actualización?

Lo que me gustaría hacer es actualizar inmediatamente después de que la aplicación entre en primer plano, si la fecha en que debería haberse disparado es en el pasado. ¿Es eso posible?


En caso de que usted u otra persona esté buscando cómo ejecutar el NSTimer en segundo plano en Swift, agregue lo siguiente a su delegado de la aplicación:

var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { return true } func applicationWillResignActive(application: UIApplication) { self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ self.endBackgroundUpdateTask() }) } func endBackgroundUpdateTask() { UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask) self.backgroundUpdateTask = UIBackgroundTaskInvalid } func applicationWillEnterForeground(application: UIApplication) { self.endBackgroundUpdateTask() }

¡Aclamaciones!


En iOS 8 puede hacer que su NSTimer funcione cuando la aplicación está en segundo plano (incluso si el iphone está bloqueado) hasta ~ 3 minutos de una manera simple:

simplemente implemente scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: método como siempre, donde lo necesite. Dentro de AppDelegate crea una propiedad:

UIBackgroundTaskIdentifier backgroundUpdateTask

luego, en su aplicación, elimine los métodos:

- (void)applicationWillResignActive:(UIApplication *)application { self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [self endBackgroundUpdateTask]; }]; } - (void) endBackgroundUpdateTask { [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask]; self.backgroundUpdateTask = UIBackgroundTaskInvalid; } - (void)applicationWillEnterForeground:(UIApplication *)application { [self endBackgroundUpdateTask]; }

después de 3 minutos, el temporizador no disparará más, cuando la aplicación vuelva al primer plano comenzará a disparar nuevamente


Necesita agregar su temporizador en el ciclo de ejecución actual.

[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];


Necesita agregar un temporizador en el ciclo Ejecutar ( Reference - Página del desarrollador de Apple para entender el ciclo de ejecución).

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:true]; [[NSRunLoop mainRunLoop] addTimer: timer forMode:NSRunLoopCommonModes]; //funcation -(void) updateTimer{ NSLog(@"Timer update"); }

Necesita agregar permisos (modos de fondo requeridos) de Fondo trabajando en infoPlist .


No debe resolver este problema configurando un temporizador, porque no tiene permitido ejecutar ningún código en segundo plano. Imagine lo que sucederá si el usuario reinicia su iPhone mientras tanto o con otros casos extremos.

Use la applicationDidEnterBackground: y applicationWillEnterForeground: métodos de su AppDelegate para obtener el comportamiento que desea. Es mucho más robusto, ya que también funcionará cuando tu aplicación muera por completo debido a un reinicio o a la presión de la memoria.

Puede guardar el tiempo que el temporizador disparará próximamente cuando su aplicación esté en segundo plano y verificar si debe tomar medidas cuando la aplicación regrese al primer plano. También pare y comience el temporizador en este método. Mientras su aplicación se está ejecutando, podría usar un temporizador para activar la actualización en el momento adecuado.


Puede can se dispare un temporizador mientras se encuentra en el modo de ejecución en segundo plano. Hay un par de trucos:

Si estás en el hilo principal:

{ // Declare the start of a background task // If you do not do this then the mainRunLoop will stop // firing when the application enters the background self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier]; }]; // Make sure you end the background task when you no longer need background execution: // [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier]; [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timerDidFire:) userInfo:nil repeats:YES]; } - (void) timerDidFire:(NSTimer *)timer { // This method might be called when the application is in the background. // Ensure you do not do anything that will trigger the GPU (e.g. animations) // See: http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW47 }

Notas

  • Las aplicaciones solo obtienen ~ 10 minutos (~ 3 minutos a partir de iOS 7) de la ejecución de fondo; después de esto, el temporizador dejará de disparar.
  • A partir de iOS 7 cuando el dispositivo esté bloqueado , suspenderá la aplicación de primer plano casi al instante. El temporizador no se activará después de que se haya bloqueado una aplicación iOS 7.

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; loop = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(Update) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:loop forMode:NSRunLoopCommonModes];