如果我运行以下代码并让应用程序在后台运行,下载仍在继续。最后,当下载完成时,我可以得到正确的回调。
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 的源代码,但是我没有找到引用的东西。
我也认为这是一个普遍的要求,但我在互联网上找不到任何有用的信息,这太奇怪了。
所以希望你能帮助我,谢谢十亿。