来自doc https://developer.apple.com/reference/uikit/uiapplication/1623031-beginbackgroundtaskwithexpiratio看起来上传文件是一个很好的用例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
?
此后台任务将使您的应用程序在用户离开您的应用程序额外 3 分钟左右后继续在后台运行(检查backgroundTimeRemaining
实际值)让您的请求完成。是的,在这 3 分钟即将结束时,如果您尚未结束后台任务,则会调用超时处理程序。
因此,如果您在应用程序的正常流程期间结束后台任务,则不需要调用此超时关闭。此关闭仅适用于任何快速的最后一刻清理,您可能需要在应用程序停止在后台运行之前执行此操作,因为在您有机会指示后台任务结束之前它已超时。这不是为了开始任何新的事情,而是为了最后一秒的清理工作。并确保在此超时处理程序中结束后台任务...如果您不结束后台任务,操作系统将立即终止您的应用程序,而不是仅仅暂停它。通常,在此超时关闭中您唯一需要做的就是结束后台任务,但如果您需要执行任何其他清理操作,则可以在此处执行此操作。
不用说,你must结束后台任务(当网络请求完成时,或者在超时处理程序中,如果您的应用程序尚未有机会在正常流程中结束后台任务)。如果不这样做,您的应用程序不仅会被暂停,还会被杀死。
关于假设用户稍后重新启动应用程序时会发生什么,您无法假设将调用哪个应用程序委托方法。即使您优雅地结束了后台任务,您也无法保证它不会因其他原因(例如内存压力)而被放弃。所以不要假设任何事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)