为什么beginBackgroundTaskWithExpirationHandler提前结束?

时间:2013-12-21 20:14:13

标签: ios ios6 ios7 background-process

我试图让它正常工作,但似乎总是在174秒(2.9分钟)结束。我一直在线关注如何使用beginBackgroundTaskWithExpirationHandler的每个教程,我没有看到我的代码有任何问题。我需要这个结束时间为8.5分钟。在调用到期处理程序之前,endBackgroundTask方法甚至不会调用。这有什么不对吗?

- (void)applicationDidEnterBackground:(UIApplication *)application {

        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
    {
        NSLog(@"Multitasking Supported");

        backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^ {
            NSLog(@"Terminated");

            //Clean up code. Tell the system that we are done.
            [application endBackgroundTask: backgroundTask];
            backgroundTask = UIBackgroundTaskInvalid;
        }];

        timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                 target:self
                                               selector:@selector(count:)
                                               userInfo:nil
                                                repeats:YES];
    }
    else
    {
        NSLog(@"Multitasking Not Supported");
    }

}



-(void)turnOffDesktops:(NSTimer *)time {
//do smth
if(count < (60*8.5)){
    NSLog(@"%d",count);
    count++;
}else{

    [application endBackgroundTask: backgroundTask];
    backgroundTask = UIBackgroundTaskInvalid;

    [timer invalidate];
    timer = nil;
    count = 0;
}

}

1 个答案:

答案 0 :(得分:5)

Apple从来没有承诺允许您执行后台任务多长时间。从历史上看(直到iOS7),应用程序通常在后台运行10分钟。 现在不再是这种情况了!观看有关背景的WWDC 2013视频。随着新的下载和添加在NSURLSession上传API(能够在外部专用守护程序上安排下载和上传任务),Apple大大减少了允许的后台时间。他们这样做是因为这个API一直用于下载和上传,而不是后台的任意任务。

您可以通过查询- [UIApplication backgroundTimeRemaining]来确定后台剩余的时间。您可以使用它来安排您的代码尽快开始。