【发布时间】:2019-06-26 20:59:19
【问题描述】:
根据Apple:
注意 您不必像本文中描述的那样使用后台会话执行所有后台网络活动。声明适当后台模式的应用可以使用默认 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
这就是 Apple 所说的“适当的背景模式”吗?还是我错过了什么?
谢谢
【问题讨论】:
-
不,这是正确的方法。您可以使用
beginBackgroundTask获得最多 180 秒的时间来完成您的任务。 -
@Paulw11 我在文档中找不到 180 秒的数字,你确定它是正确的吗?
-
180 秒是适用于所有 iOS 应用程序的后台时间,但该值可能会随 Apple 的突发奇想在不同版本之间发生变化(但多年来一直是 180 秒);您所知道的是,您提供的
expirationHandler将在您的应用程序用完之前不久被调用。如果您在调用过期处理程序时没有结束后台任务,那么 iOS 将终止您的应用程序。 -
您也可以使用backgroundTimeRemaining查看您的后台剩余时间;但是请注意,在 Xcode 后台运行时不会强制执行时间限制。