¿Cómo ejecutar NSTimer en segundo plano y dormir en iOS?

Encontré una gran cantidad de publicaciones en stackoverflow sobre la ejecución de NSTimer en segundo plano.

Sin embargo, no encontré ninguna solución.

En mi aplicación, escucho el sonido en segundo plano y programé el timer para detener la música cuando llegó ese momento.

Por lo tanto, necesito ejecutar mi background NSTimer (significa cuando el button de inicio hace clic y duerme iPhone).

¿Cómo puedo hacer eso?

 // NSTimer run when app in background <br> [[UIApplication shanetworkingApplication] beginBackgroundTaskWithExpirationHandler:nil]; loop = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(Update) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:loop forMode:NSRunLoopCommonModes]; 

Esto es lo que quieres ?.

No puedes

Los timeres solo existen dentro de su aplicación. Entonces (a exception de una window muy pequeña) cuando su aplicación se envía al background, los timeres ya no pueden disparar.

(El audio sigue funcionando, porque es jugado por el sistema y no por su aplicación).

Entonces no puedes usar timeres para este propósito.

Lo que puede hacer, como sugiere iPatel, es usar una notificación local, en su lugar. Esto despertará brevemente tu aplicación, lo que te permitirá dejar de reproducir la música.

Obtenga el formulario [Esta pregunta] ( http://iphonedevsdk.com/forum/iphone-sdk-development/58643-keep-nstimer-running-when-app-is-in-background-multitasking.html )

 - (void)btnSetupNotificationClicked:(id)sender { UILocalNotification* pOrderCompletedNotification=[[UILocalNotification alloc] init]; if(pOrderCompletedNotification!=nil) { [pOrderCompletedNotification setFireDate:[[NSDate alloc] initWithTimeIntervalSinceNow:5.00]]; // [pOrderCompletedNotification setApplicationIconBadgeNumber:1]; [pOrderCompletedNotification setTimeZone:[NSTimeZone systemTimeZone]]; [pOrderCompletedNotification setSoundName:@\"OrderCompleted.m4a\"]; [pOrderCompletedNotification setAlertBody:@\"Order Completed\"]; [pOrderCompletedNotification setAlertAction:nil]; [pOrderCompletedNotification setHasAction:NO]; UIApplication* pApplication=[UIApplication shanetworkingApplication]; if(pApplication!=nil) { [pApplication scheduleLocalNotification:pOrderCompletedNotification]; } else { NSLog(@\"Application singleton allocation error.\"); } [pOrderCompletedNotification release]; [pApplication release]; } else { NSLog(@\"Local notification creation error.\"); } // if } 

Con Swift

 let app = UIApplication.shanetworkingApplication() app.beginBackgroundTaskWithExpirationHandler(nil) let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:"DoSomethingFunctions", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 

Cuando ejecuta NSTimer , el método @selector determinará si desea ejecutar en segundo plano o en el subprocess principal.

Configuración inicial:

 self.scanTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(manageMethod) userInfo:nil repeats:YES]; //@property (nonatomic, strong) NSTimer *scanTimer 

Caso que desea ejecutar en Antecedentes:

 -(void)manageMethod { dispatch_queue_t queue = dispatch_queue_create("com.mysite.thread1",NULL); dispatch_async(queue,^{ //run in background }); }