当应用程序进入后台时,Swift URLSession DataTask失败

时间:2019-06-26 20:59:19

标签: ios swift xcode

根据Apple

  

注意   您不必按照本文所述使用后台会话进行所有后台网络活动。声明了适当的后台模式的应用程序可以使用默认的URL会话和数据任务,就像它们位于前台一样。

我正在尝试将DataTask与默认会话配置和委托一起使用(而不是完成处理程序),但是如果我按下home按钮并再次切换回应用程序,我的数据任务总是失败:

Task <A25361F9-CAC0-4FA8-8663-777E1C6878A2>.<2> load failed with error Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <A25361F9-CAC0-4FA8-8663-777E1C6878A2>.<2>, _kCFStreamErrorDomainKey=1, NSErrorPeerAddressKey=<CFData 0x108f07b40 [0x1db6c1420]>{length = 16, capacity = 16, bytes = 0x100201bb68118e240000000000000000}, _kCFStreamErrorCodeKey=53, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <A25361F9-CAC0-4FA8-8663-777E1C6878A2>.<2>"

我尝试过的方法:使用共享会话(带有或不带有完成处理程序),都是同样的问题。

我的问题是:“声明适当背景模式的应用可以使用默认的URL会话和数据任务”是什么意思?您如何声明那些背景模式?

我遇到的唯一一件事是UIApplication.shared.beginBackgroundTask

这是Apple所谓“适当的背景模式”的意思吗?还是我想念什么?

谢谢

1 个答案:

答案 0 :(得分:1)

是的,beginBackgroundTask(withName:expirationHandler:)是请求操作系统给您的应用程序一些时间来完成它在用户离开应用程序之前启动的请求的正确方法。参见Extending Your App's Background Execution Time

  

这是Apple所谓“适当的背景模式”的意思吗?

他们正在谈论可能会使您的应用在后台运行的任何技术。参见About the Background Execution Sequence。其中一种模式是“后台任务”,其中即使您的应用程序不再处于前台,也给您有限的时间来完成任务。

另一个是background fetch。如果启用,则在后台获取期间,操作系统可以自行决定在后台启动您的应用,让您执行请求,然后在完成时调用完成处理程序。 (在这种情况下,您甚至不到3分钟,大约30秒的IIRC。)这是“适当的背景模式”的示例,您将为此使用标准/默认URLSessionConfiguration,而不是背景一。 Apple指出了这一点,因为否则很容易假设任何与后台相关的网络请求都将需要后台URLSessionConfiguration。但是事实并非如此。

因此,如果您只是试图让应用程序继续运行以完成任务,即使用户按下了主页按钮,那么将beginBackgroundTask与标准URLSession结合使用就足够了。或者,如果您碰巧正在使用其中一种“经过批准的背景模式”(听起来可能不是您的情况),那么再次使用标准URLSession就足够了。

背景URLSession确实适用于请求可能需要比分配的时间更长的情况。也许您正在下载许多非常大的资产(例如电影),可能需要花费几分钟以上。只有在这种情况下,您才需要使用背景URLSessionConfiguration.background(withIdentifier:)。这仅取决于请求将花费多长时间。