【问题标题】:SendSynchronousRequest triggers background expiration handler - IOSSendSynchronousRequest 触发后台过期处理程序 - IOS
【发布时间】:2012-07-06 01:02:36
【问题描述】:

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

   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 仍然调用过期块处理程序。

【问题讨论】:

    标签: ios


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 在查询剩余时间时,我还有 596 秒,但 IOS 仍然调用过期块处理程序。它发生在同步发送完成后....
    【解决方案2】:

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

    【讨论】:

    • 我认为发生的事情是,由于您的应用程序处于后台,所有线程当前都处于睡眠状态或不存在......当您接到操作系统的呼叫时,应用程序会唤醒单个后台线程...它可能不允许您打开其他线程,因为这可能会永远持续下去,所以它只会触发过期处理程序。
    猜你喜欢
    • 2015-04-21
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多