0

这就是我在应用程序进入后台时启动后台任务的方式,

   void applicationDidEnterBackground:(UIApplication *)application
{
    btId = UIBackgroundTaskInvalid;
    UIApplication* cuiApplication = [UIApplication sharedApplication];

    void (^backgroundTimeRemainingExtenderHandler)() = ^() {

        NSTimeInterval timeRemaining1 = [cuiApplication backgroundTimeRemaining];

        if(btId != UIBackgroundTaskInvalid){
            [proximityEngine StopEngine];
            [cuiApplication endBackgroundTask:btId];
            btId = UIBackgroundTaskInvalid;
        }
    };

    btId= [cuiApplication beginBackgroundTaskWithExpirationHandler:backgroundTimeRemainingExtenderHandler];

    if(bgmanager != nil){
        [bgmanager BeginBackgroundTaskMainLoop];
    } 
}

我的问题是当我的后台任务调用时:

NSURLConnection 发送同步请求

即使有更多的剩余时间,也会调用到期块,我该如何防止这种情况?

问候 ,

詹姆士

编辑 :

阅读下面的答案后:查询剩余时间时,我还有 596 秒,但 IOS 仍然调用过期块处理程序。

4

2 回答 2

1

beginBackgroundTaskWithExpirationHandler:是应用程序在进入后台后请求一些额外的后台时间来进行一些整理的方法。但是,iOS 保留决定它将为您提供多少时间(如果有的话)的权利,并且如果您未能在规定的时间内结束,则终止您的进程。

您不能无限期地在后台执行,也不能选择自己的时间限制。您可以查询您分配backgroundTimeRemaining的内容,但这几乎是全部范围。

根据文档,处理程序被称为“在应用程序的剩余后台时间达到 0 之前不久”。所以你应该期望backgroundTimeRemaining不完全为零。

话虽这么说,如果您的 URL 连接尚未完成,那么您只需在某处指出它未完成并在您下次从后台返回时处理错误,通常是重试。这就是您的过期处理程序应该做的事情,并且它需要快速完成。

但是,分配给您的应用程序的额外时间是不可协商的。

于 2012-07-06T01:27:20.593 回答
1

在我的特殊情况下 - 我不太清楚为什么它的行为方式,我在与 beginbackgroundtask 线程不同的线程上执行任务,在 sendsync 在该线程中返回后,backgroundtask 被操作系统中断。在 beginbackground 原始线程中调用 sendsync 时,不会发生。不确定它是否合乎逻辑,我做错了什么或操作系统错误。

于 2012-07-21T00:38:42.530 回答