如何在iOS的背景和睡眠运行的NSTimer?(How to run NSTimer in back

2019-08-17 04:34发布

我发现很多帖子在计算器有关NSTimer在后台运行。

但是我没有找到任何解决方案。

在我的应用程序,我在后台播放的声音和我设置计时器停止音乐,当它到达该时间。

所以,我需要运行我NSTimer背景(意思是,当主按钮点击睡觉iPhone)。

我怎样才能做到这一点?

Answer 1:

// NSTimer run when app in background <br>

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

这就是你想要什么?



Answer 2:

你不能

计时器只在应用程序中存在。 所以,(除了一个很小的窗口)当您的应用程序发送到后台,定时器不能再火。

(音频继续运行,因为它是由系统播放,而不是由您的应用程序。)

所以你不能使用定时器用于这一目的。

你能做什么 - 通过iPatel的建议 - 是使用本地通知,来代替。 这将简要地唤醒你的应用程序,让你停止播放音乐。



Answer 3:

获取表格[此问题]( 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 sharedApplication];
        if(pApplication!=nil)
        {
            [pApplication scheduleLocalNotification:pOrderCompletedNotification];
        }
        else
        {
            NSLog(@\"Application singleton allocation error.\");
        }

        [pOrderCompletedNotification release];
        [pApplication release];
    }
    else
    {
        NSLog(@\"Local notification creation error.\");
    }   // if
}


Answer 4:

随着斯威夫特

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


Answer 5:

当您运行NSTimer ,该@selector方法本身将决定无论您想在后台或主线程中运行。

初始设置:

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

如果你想在后台运行:

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


文章来源: How to run NSTimer in background and sleep in iOS?