如果我运行以下代码并让应用程序在后台运行,则下载仍在继续。最后,当下载完成后,我可以得到正确的回调。
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier)
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil)
let url = NSURLRequest(URL: NSURL(string: data[1])!)
let downloadTask = backgroundSession.downloadTaskWithRequest(url)
downloadTask.resume()
但我有一个要求,那就是我必须判断服务器返回给我的是什么,如果它是json,我不做下载,所以我想首先得到响应头,然后如果需要下载,我将数据任务更改为下载任务,所以我做了如下代码
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier)
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil)
let url = NSURLRequest(URL: NSURL(string: data[1])!)
//I change the downloadTaskWithRequest to dataTaskWithRequest
let downloadTask = backgroundSession.dataTaskWithRequest(url)
downloadTask.resume()
然后我可以在回调中获取响应头,如果需要下载文件,我可以将数据任务更改为下载任务,如下所示
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
if let response = response as? NSHTTPURLResponse {
let contentType = response.allHeaderFields["Content-Type"] as! String
if contentType == "image/jpeg" {
//change the data task to download task
completionHandler(.BecomeDownload)
return
}
}
completionHandler(.Allow)
}
到目前为止一切顺利。当我在前台运行应用程序时,效果就像我想的那样。但是在应用程序在后台运行后,下载将停止,然后当我打开应用程序时,控制台会显示“丢失与后台传输服务的连接”。
我认为Apple非常聪明,他给了我们许多有用的回调,但现在,我不知道我错在哪里,而且我也看到了有关AFNetworking和Alamofire的源代码,但我没有找到引用的东西。
我也认为这是一个常见的要求,但我在互联网上找不到任何有用的信息,这太奇怪了。
所以希望你能帮助我,感谢十亿人。
答案 0 :(得分:0)
启用后台模式 Xcode-> Target->功能 - >在后台模式下,选择背景提取选项。
答案 1 :(得分:0)
我看到的主要问题是你两次调用completionHandler
。您需要退回内容类型条件,如下所示:
if contentType == "image/jpeg" {
//change the data task to download task
completionHandler(.BecomeDownload)
return
}
否则,您似乎正在正确使用逻辑。希望有所帮助。
答案 2 :(得分:0)
问题从你自己的答案中可见一斑。这不是一个错误,你只是无法使用数据任务进行后台传输而只是下载任务。
Here是正确的完整答案。