如何将属性传递给 swift 3 urlsession did完成下载到后台下载后委托?



我可以在后台成功下载一个zip文件,其中包含我的应用程序代码,其中包含iOS 10和swift 3。

我使用后台会话数据任务:

let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix))
let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)
var request = URLRequest(url: dlUrl )
request.httpMethod = "GET"
request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData
let task = backgroundSession.downloadTask(with: request)
task.resume()

但我想知道下载完成后将一些特定元数据传递给委托方法的最佳实践是什么:

func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL){

我需要在这个委托中提供有关该下载的一些信息,这些信息取决于例如用户之前做出的选择。我无法从服务器或 url 获取此数据。

所以我想有一个变量或字典下载类型告诉我如何处理完成的下载,在委托中有这样的东西

if downloadType == "normal" ... do this
else ... do that

我不确定在应用程序挂起时是否可以安全地使用实现 URLSessionDownloadDelegate 协议的类的属性? 在应用挂起时下载完成后,类实例本身是否会还原,还是 ios 会创建类的新实例?

所以这将永远有效:

class ServerCom: NSObject, URLSessionDownloadDelegate {
var updateTypeStr = ""
[...]
func somePublic(setUpdateType: String) {
self.updateTypeStr = setUpdateType
[...]
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL){
[...] 
if( self.updateTypeStr == "normal" ) { // do this
else { // do that

对于该用例,是否有更好的方法?

提前感谢!

应用程序挂起时下载完成后,类实例本身是否会恢复,或者 ios 会创建类的新实例?

您有责任自己保存和恢复它。

在守护程序完成后台请求的中间时间段内,您的应用程序可能会完全终止(例如,已被挂起,可能会由于内存压力而被丢弃),因此您必须能够将任何相关信息保存到持久存储,并能够在应用程序重新启动时从存储中加载此信息。

使用后台会话测试应用程序时,我发现使用调用exit(0)来终止应用程序的代码很有用。你永远不会在生产应用中执行此操作,但在后台请求完成后重新启动应用时,测试应用重新创建必要对象的能力时,它非常有用。关键点是,在进行此测试时,不应尝试使用"双击主页按钮并向上滑动"来终止应用程序,因为根据设计,这也将取消后台请求。你想要测试以下方案:你的应用在正常的应用生命周期中被终止,并且在后台请求完成后由网络守护程序重新启动。

最新更新