0

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

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)

}

到目前为止,一切都很好。当我在前台运行应用程序时,效果和我想的一样。但是应用程序在后台运行后,下载停止,然后当我打开应用程序时,控制台显示“与后台传输服务的连接丢失”。

原以为苹果很聪明,他给了我们很多有用的回调,但是现在,我不知道我哪里错了,我也看到了关于 AFNetworking 和 Alamofire 的源代码,但是我没有找到引用的东西。

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

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

4

3 回答 3

0

在 Xcode->Target->Capabilities->On Background Mode 中启用 Background Mode 并选择 Background Fetch 选项。

于 2016-05-07T17:38:17.617 回答
0

从您自己的回答中可以看出问题所在。这不是错误,您根本无法将数据任务用于后台传输,而只是下载任务。

是正确的完整答案。

于 2017-10-16T21:41:43.307 回答
0

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

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

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

于 2016-05-08T01:55:10.093 回答