Как узнать, работает ли NSURLSessionDownloadTask, когда приложение приостановлено?

Когда мое приложение работает на переднем плане, я вижу периодические вызовы: NSURLSessionDownloadDelegate -> URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

Когда мое приложение переходит в фоновый режим и приостанавливается, вызовы этого метода прекращаются, поэтому у меня нет обратной связи о том, продолжает ли загрузка NSURLSessionDownloadTask. Существуют ли какие-либо способы получения отзывов о загрузке?


person drbobdugan    schedule 20.10.2015    source источник


Ответы (1)


Глядя на другие сообщения StackOverflow о NSURLSessionDownloadTask, возникает много путаницы. Вот механизмы обратной связи, которые я обнаружил:

  • используйте сетевой прокси и анализатор пакетов, например Wireshark (см. это для подробностей). Отфильтруйте весь трафик, кроме трафика на/с сервера, с которого вы загружаете файл. Ищите FIN, ACK, чтобы указать, что загрузка завершена. Вы также можете использовать анализатор пакетов для диагностики проблем с загрузкой. Wireshark

Wireshark

  • используйте Instruments для захвата сетевого трафика для процесса nsurlsessiond

Захват инструментов для nsurlsessiond

  • используйте xcode Window->Devices->Download Container для загрузки приложения с телефона во время фоновой загрузки. Вы найдете кешированную версию частично загруженного файла в: /Library/Caches/com.apple.nsurlsessiond/Downloads/[id]/CFNetworkDownload_...tmp, где [id] – это уникальный идентификатор, который вы указали при создании объекта NSURLSessionConfiguration. Кэшированная версия увеличивается в размере во время фоновой загрузки, поэтому вы можете загружать контейнер несколько раз, чтобы убедиться, что загрузка выполняется. После завершения загрузки кэшированная версия удаляется.

  • дождитесь завершения загрузки. Если ваше приложение находится в фоновом режиме и приостановлено после завершения загрузки, iOS переводит ваше приложение из приостановленного состояния в активное фоновое и вызывает следующие методы в указанном порядке:

  • через UIApplicationDelegate -> handleEventsForBackgroundURLSession в AppDelegate, который запускает вызов метода completionHandler()

  • через 'NSURLSessionDownloadTaskDelegate -> URLSession:downloadTask:didFinishDownloadingToURL:'
  • через NSURLSessionTaskDelegate -> NSURLSession:task:didCompleteWithError:
  • через NSURLSessionDelegate -> :URLSessionDidFinishEventsForBackgroundURLSession:
  • iOS дает приложению ВСЕГО 30 секунд, чтобы обработать завершение загрузки в фоновом режиме, прежде чем приостановить приложение.

Я также разместил очень простой пример приложения NSURLSessionDownload на github здесь.

person drbobdugan    schedule 20.10.2015