Если я запустил следующий код и включил приложение в фоновом режиме, загрузка по-прежнему продолжается. Наконец, когда загрузка закончена, я могу получить правильный обратный вызов.NSURLSession, после того, как задача данных преобразуется в задачу загрузки, ее нельзя загрузить в фоновом режиме
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, но я не нашел ссылающаяся вещь.
Я также считаю, что это обычное требование, но я не могу найти полезную информацию в Интернете, это слишком странно.
Так что надеюсь, что вы можете мне помочь, благодаря миллиарду.
Как сказал один из сотрудников Apple, это ошибка от ОС. Поэтому я ушел так. Новый способ, который я делаю сейчас, - создать задачу загрузки. После загрузки данных, чтобы судить заголовок ответа, если данные являются изображением, передайте данные в другое место, если это json, прочитайте его из файла tmp и выполните обработку ссылок. – Changwei