繁体   English   中英

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

[英]Swift URLSession DataTask Fails when the app enters the background

苹果称

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

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

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

这就是苹果所说的“适当的背景模式”吗? 或者我错过了什么?

谢谢你

是的, beginBackgroundTask(withName:expirationHandler:)是请求操作系统给您的应用程序一点时间来完成它在用户离开应用程序之前启动的请求的正确方法。 请参阅延长应用程序的后台执行时间

这就是苹果所说的“适当的背景模式”吗?

他们谈论的是可能让您的应用程序在后台运行的任何技术。 请参阅关于后台执行序列 “后台任务”是其中一种模式,即使您的应用程序不再处于前台,您也有有限的时间来完成任务。

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

因此,如果您只是想让应用程序继续运行以完成任务,即使用户点击了主页按钮,那么beginBackgroundTask与标准URLSession结合就足够了。 或者,如果您碰巧使用了其中一种“批准的后台模式”(这听起来不像您的情况),那么同样,标准URLSession就足够了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM