NSURLSession,在将数据任务转换为下载任务后,无法在后台下载

时间:2016-05-07 16:36:18

标签: ios alamofire nsurlsessiondownloadtask afnetworking-3 nsurlsessiondatatask

如果我运行以下代码并让应用程序在后台运行,则下载仍在继续。最后,当下载完成后,我可以得到正确的回调。

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的源代码,但我没有找到引用的东西。

我也认为这是一个常见的要求,但我在互联网上找不到任何有用的信息,这太奇怪了。

所以希望你能帮助我,感谢十亿人。

3 个答案:

答案 0 :(得分:0)

启用后台模式  Xcode-> Target->功能 - >在后台模式下,选择背景提取选项。

答案 1 :(得分:0)

我看到的主要问题是你两次调用completionHandler。您需要退回内容类型条件,如下所示:

if contentType == "image/jpeg" {
    //change the data task to download task
    completionHandler(.BecomeDownload)
    return
}

否则,您似乎正在正确使用逻辑。希望有所帮助。

答案 2 :(得分:0)

问题从你自己的答案中可见一斑。这不是一个错误,你只是无法使用数据任务进行后台传输而只是下载任务。

Here是正确的完整答案。