运行有限长度的后台任务

时间:2012-12-14 08:35:00

标签: ios ios5 ios4 ios6


当应用程序进入后台状态时我正在进行一些处理,我把它放在 beginBackgroundTaskWithExpirationHandler()之下,因此,应该分配十分钟。但是,我相信该应用程序在此之前被暂停。我正在执行的任务是内存和CPU密集型,因此操作系统是否可能将我的应用程序暂停状态?
如果是这样,有没有办法绕过这些限制。 (我愿意使用私有API)。

以下是启动后台任务的代码:

   if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){

        if([[UIDevice currentDevice] isMultitaskingSupported]){
            __block UIBackgroundTaskIdentifier bgTask;
            UIApplication *application = [UIApplication sharedApplication];
            bgTask = [application beginBackgroundTaskWithExpirationHandler:^{

                    [application endBackgroundTask:bgTask];
                    bgTask = UIBackgroundTaskInvalid;
            }];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [self captureImage];
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            });
        }
    }

2 个答案:

答案 0 :(得分:2)

我不确定Daij-Dan是完全正确的。

这部分我同意他的意见:

the os may kill you at any time when its pressured.

然而,“压力”这个词很模糊。而且我认为应该有很多压力(例如低内存)来暂停合法请求更多时间的应用程序。一方面,这是一个真实的情景案例。另一方面,它的发生并不常见(iOS设备现在有相当多的内存)。

来自文档(http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html):

对此方法的每次调用都必须通过匹配对endBackgroundTask的调用来平衡: 方法。运行后台任务的应用程序运行它们的时间有限。 (您可以使用backgroundTimeRemaining属性找出可用的时间。)如果您没有在时间到期之前调用endBackgroundTask:对于每个任务,系统会终止应用程序。如果在handler参数中提供块对象,系统会在时间到期之前调用您的处理程序,以便您有机会结束任务。

我建议:

  • 在完成处理程序中添加一些日志
  • 使用逻辑(包括backgroundTimeremaining)
  • 将日志添加到日志中

如果你的应用被暂停,请查看系统控制台日志。

P.S。我删除了iphone-privateapi标签,因为它是公共API。

答案 1 :(得分:1)

当压力很大时,操作系统可能会随时杀死你。十分钟没有保证。 (如果你表现的话,你也可以跑得更久:D)

无法强制ios运行您的应用AFAIK