从doc开始,上传文件似乎是使用beginBackgroundTaskWithExpirationHandler
的一个很好的用例。我发现使用
let uploadTask = session.uploadTask(with: request as URLRequest, fromFile: file)
uploadTask.resume()
应用程序后台运行时,已经运行(我上传进度ping了一段时间)。另外,我可以将URLSession设置为背景:
let config = URLSessionConfiguration.background(withIdentifier: "uploads")
session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
那么使用beginBackgroundTaskWithExpirationHandler
有什么好处?它会延长我完成上传的时间吗?如果是这样,我可以知道多少(在文档中没有看到任何相关内容)?或者只是在应用程序停止之前我会被ping?我应该将它与后台URLSession结合使用吗?
此外,文档说处理程序将在应用程序的剩余后台时间达到0之前不久被调用这是否意味着应用程序将在此之后终止?即我可以假设下一个电话会是application:didFinishLaunchingWithOptions
还是applicationDidBecomeActive
?
答案 0 :(得分:2)
此后台任务将让您的应用在用户离开您的应用3分钟左右后继续在后台运行(检查backgroundTimeRemaining
实际值)以完成您的请求。并且,是的,在接近3分钟结束时,如果您尚未结束后台任务,将调用超时处理程序。
因此,如果您在应用程序的正常流程中结束后台任务,则不需要调用此超时闭包。此关闭仅用于任何快速,最后一分钟的清理,您可能需要在应用程序在后台运行之前执行,因为它在您有机会指示后台任务结束之前超时。这不是开始任何新事物,而是任何最后的第二次清理。并确保在此超时处理程序中结束后台任务...如果您不结束后台任务,操作系统将立即终止您的应用程序而不是暂停它。通常,在此超时关闭中您唯一需要做的就是结束后台任务,但如果您需要进行任何其他清理,那么您可以在此处执行此操作。
毋庸置疑,您必须结束您的后台任务(无论是在网络请求完成时,还是在超时处理程序中,如果您的应用尚未有机会结束后台任务)正常流量)。如果你不这样做,你的应用程序不会被暂停,而是会被杀死。
关于对用户稍后重新启动应用时会发生什么的假设,您不能假设将调用哪个应用委托方法。即使您优雅地结束了后台任务,也无法保证不会因其他原因(例如内存压力)而被抛弃。所以不要假设任何事情。
答案 1 :(得分:1)
那么使用带有过期处理程序的开始后台任务有什么好处?
如果您要使用URLSessionConfiguration.background
,则没有这样的优势,您根本不应该使用beginBackgroundTask(expirationHandler:)
。你的整个前提(你的第一句话)是错的。上传文件不是beginBackgroundTask(expirationHandler:)
的一个好用例。这是URLSessionConfiguration.background
的一个很好的用例。这两件事情彼此无关。