【问题标题】:How do I know if NSURLSessionDownloadTask is working when application is suspended?当应用程序挂起时,我如何知道 NSURLSessionDownloadTask 是否正在工作?
【发布时间】:2015-10-20 16:42:22
【问题描述】:

当我的应用程序在前台运行时,我会看到定期调用: NSURLSessionDownloadDelegate -> URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

当我的应用程序移动到后台并被挂起时,对该方法的调用将停止,因此我没有关于 NSURLSessionDownloadTask 是否继续下载的反馈。是否有任何技术可以获取有关下载的反馈?

【问题讨论】:

    标签: ios nsurlsessiondownloadtask


    【解决方案1】:

    从查看有关NSURLSessionDownloadTask 的其他 StackOverflow 帖子来看,有很多困惑。以下是我发现的反馈机制:

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

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

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

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

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

    • 通过'NSURLSessionDownloadTaskDelegate -> URLSession:downloadTask:didFinishDownloadingToURL:'
    • 通过NSURLSessionTaskDelegate -> NSURLSession:task:didCompleteWithError:
    • 通过NSURLSessionDelegate -> :URLSessionDidFinishEventsForBackgroundURLSession:
    • iOS 为应用程序提供了总共 30 秒的时间在后台处理下载结束,然后暂停应用程序

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

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多