这是我在应用程序进入后台时启动后台任务的方式,
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 sendSynchronousRequest
即使有更多时间重新启动,也会调用过期块,我该如何防止这种情况?
问候,
詹姆斯
编辑:
阅读下面的答案后:在查询剩余时间时仍然有596秒,但IOS仍然会调用到期块处理程序。
答案 0 :(得分:1)
beginBackgroundTaskWithExpirationHandler:
是应用程序请求一些额外的后台时间来进行一些整理后进入后台的方法。但是iOS保留决定它将为您提供多长时间的权利(如果有的话),并且如果您未能在规定的时间内结束,则会终止您的流程。
您无法无限期地在后台执行,也无法选择自己的时间限制。您可以通过backgroundTimeRemaining
查询您已分配的内容,但这几乎是完全的。
每个the documentation处理程序在应用程序的剩余后台时间达到0之前不久被调用。所以你应该期望backgroundTimeRemaining
不是零。
话虽这么说,如果您的网址连接尚未完成,那么您只是想注意它没有完成并在下次从后台返回时处理错误,通常是再次尝试。这就是你的到期处理程序应该做的事情,它需要快速完成。
分配给您的应用的额外时间是不可协商的。
答案 1 :(得分:1)
在我的特殊情况下 - 我不太确定它为什么表现它的行为方式,我在与beginbackgroundtask线程不同的线程上执行任务,在该线程中返回的sendync后,操作系统中断了后台任务。 在beginbackground原始线程中调用sendync时,它不会发生。 不确定它是否合乎逻辑,我做错了什么或操作系统错误。