0

Если я запустил следующий код и включил приложение в фоновом режиме, загрузка по-прежнему продолжается. Наконец, когда загрузка закончена, я могу получить правильный обратный вызов.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, но я не нашел ссылающаяся вещь.

Я также считаю, что это обычное требование, но я не могу найти полезную информацию в Интернете, это слишком странно.

Так что надеюсь, что вы можете мне помочь, благодаря миллиарду.

+0

Как сказал один из сотрудников Apple, это ошибка от ОС. Поэтому я ушел так. Новый способ, который я делаю сейчас, - создать задачу загрузки. После загрузки данных, чтобы судить заголовок ответа, если данные являются изображением, передайте данные в другое место, если это json, прочитайте его из файла tmp и выполните обработку ссылок. – Changwei

ответ

0

Включить фоновый режим в Xcode-> Target-> Capabilities-> В фоновом режиме и выберите опцию Background Fetch.

0

Основная проблема, которую я вижу, заключается в том, что вы дважды вызываете completionHandler. Вы должны вернуться из вашего типа содержимого условие следующим образом:

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

В противном случае создается впечатление, что вы правильно используете логику. Надеюсь, это поможет.

+0

Спасибо за ваш ответ, извините, что я скопировал код с неправильной логикой. На первый взгляд, хотя я только пишу один код строки - «completeHandler (.BecomeDownload)» в обратном вызове «didReceiveResponse». У меня такая же ошибка. Я создал демо на github, если вам это удобно, загрузите его и запустите, когда он начнет загружаться, нажмите кнопку «домой», а затем снова откройте приложение, вы увидите ошибку. https://github.com/tuchangwei/data_task_convert_to_download_task – Changwei

0

Проблема очевидна из вашего собственного ответа. Это не ошибка, вы просто не могли использовать задачи с данными для фоновых передач только для загрузки задач.

Here - правильный ответ.

+0

Спасибо, прочитайте данные из файла tmp - это хороший способ судить, загружен ли файл мультимедиа или данные json. – Changwei

 Смежные вопросы

  • Нет связанных вопросов^_^