嘿,我正在开发一个应用程序,在其中我必须每30秒进行一次API调用,所以我为它创建了NSTimer。但是当我的应用程序进入后台时,计时器在3-4分钟后停止触发。所以它只能在后台工作3-4分钟,但在那之后就不能工作了。如何修改我的代码使计时器不会停止。
下面是我的一些代码。
- (IBAction)didTapStart:(id)sender {
NSLog(@"hey i m in the timer ..%@",[NSDate date]);
[objTimer invalidate];
objTimer=nil;
UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
objTimer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self
selector:@selector(methodFromTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:objTimer forMode:UITrackingRunLoopMode];
}
-(void)methodFromTimer{
[LOG debug:@"ViewController.m ::methodFromTimer " Message:[NSString stringWithFormat:@"hey i m from timer ....%@",[NSDate date] ]];
NSLog(@"hey i m from timer ....%@",[NSDate date]);
}
我甚至用下面的代码修改了代码:
[[NSRunLoop mainRunLoop] addTimer:objTimer forMode:NSRunLoopCommonModes];
这也不管用。
发布于 2014-09-04 14:21:27
不要将UIBackgroundTaskIdentifier任务创建为本地任务,将其设置为全局任务,如下所示:
第1步
第2步
第3步
第4步
因为局部的松散作用域和全局的松散作用域,我创建了一个演示,并用1秒的重复计时器运行了一段时间,并且工作得很顺利。不过,如果你遇到问题,请让我知道。
我又运行了一次demo,下面是它运行的日志。
所以它工作得很好,超过了3分钟。同样,3分钟的逻辑是正确的,但由于uibackgroundtask任务是启动的,所以它不应该让它杀死计时器的这个任务。
编辑的部分:- bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ app endBackgroundTask:bgTask;//删除此行,只要计时器正在运行,它就会运行,当应用被终止时,它的所有变量和作用域都会自动转储。}];
检查一下,让我知道它是否有效。
嘿,我运行你的代码,我到达了expirationHandler,但在释放调试点之后,计时器运行得很顺利。
发布于 2014-09-04 13:57:59
不,不要使用NSTimer执行后台任务。它不会像你预期的那样工作。您应该只使用Apple提供的后台获取API。您可以在该API中设置您想要的调用时长。虽然通常不建议设置您想要进行的呼叫的持续时间。看一下这个apple background programming documentation
此外,为了让您快速入门,您可以使用以下Appcoda tutorial
发布于 2014-09-04 14:31:11
这是正常的行为。
在iOS7之后,你只有3分钟的后台时间。如果我没记错的话,在那之前有10分钟。为了扩展这一点,你的应用需要使用一些特殊的服务,如位置,音频或蓝牙,这将使它在后台保持“活力”。
此外,即使您使用这些服务之一,也必须在您的设备上为应用程序启用“后台应用程序刷新”设置。
有关详细信息,请参阅this answer或文档的后台执行部分。
https://stackoverflow.com/questions/25658064
复制相似问题