当应用程序挂起时,我如何知道NSURLSessionDownloadTask是否正常工作?

时间:2015-10-20 16:42:22

标签: ios nsurlsessiondownloadtask

当我的应用程序在前台运行时,我看到定期调用: class SourceType { public int Id; public string Name; public int Age { get; set; } // other properties } class DestinationType { public int Id; public string Name; public int Age { get; set; } // other properties } List<SourceType> sourceList = new List<SourceType>(); sourceList.Add(new SourceType { Id = 1, Name = "1111", Age = 35}); sourceList.Add(new SourceType { Id = 2, Name = "2222", Age = 26}); sourceList.Add(new SourceType { Id = 3, Name = "3333", Age = 43}); sourceList.Add(new SourceType { Id = 5, Name = "5555", Age = 37}); List<DestinationType> destinationList = new List<DestinationType>(); destinationList.Add(new DestinationType { Id = 1, Name = null }); destinationList.Add(new DestinationType { Id = 2, Name = null }); destinationList.Add(new DestinationType { Id = 3, Name = null }); destinationList.Add(new DestinationType { Id = 4, Name = null }); var mapped= destinationList.Join(sourceList, d => d.Id, s => s.Id, (d, s) => { d.Name = s.Name; d.Age = s.Age; return d; }).ToList();

当我的应用程序移至后台并暂停时,对此方法的调用将停止,因此我对NSURLSessionDownloadTask是否继续下载没有任何反馈。是否有任何技术可以获得有关下载的反馈?

1 个答案:

答案 0 :(得分:1)

通过查看有关NSURLSessionDownloadTask的其他StackOverflow帖子,存在很多混淆。以下是我发现的反馈机制:

  • 使用网络代理和数据包嗅探器,如Wireshark(有关详细信息,请参阅this)。过滤除往/或从您下载文件的服务器的流量以外的所有流量。查找FIN,ACK以表示下载已完成。您还可以使用数据包嗅探器来诊断下载问题。 Wireshark的

Wireshark

  • 使用Instruments来捕获流程nsurlsessiond
  • 的网络流量

Instruments capture for nsurlsessiond

  • 在后台下载期间使用xcode Window->Devices->Download Container从手机下载应用。您将在/Library/Caches/com.apple.nsurlsessiond/Downloads/[id]/CFNetworkDownload_...tmp中找到部分下载文件的缓存版本,其中[id]是您在创建NSURLSessionConfiguration对象时提供的唯一ID。在后台下载期间,缓存版本的大小会增加,因此您可以多次下载容器以验证下载是否正在进行。下载完成后,将删除缓存版本。

  • 等待下载完成。如果您的应用程序在后台并在下载完成时暂停,则iOS会将您的应用程序从挂起状态移至后台主动运行,并按此顺序调用以下方法:

  • 通过AppDelegate中的UIApplicationDelegate -> handleEventsForBackgroundURLSession触发调用completionHandler()方法

  • via&#39; NSURLSessionDownloadTaskDelegate - &gt; URLSession:downloadTask:didFinishDownloadingToURL:&#39;
  • 通过NSURLSessionTaskDelegate -> NSURLSession:task:didCompleteWithError:
  • 通过NSURLSessionDelegate -> :URLSessionDidFinishEventsForBackgroundURLSession:
  • iOS为应用程序提供30秒TOTAL以在暂停应用程序之前在后台处理下载结束

我还在github here上放了一个非常基本的NSURLSessionDownload示例应用程序。