【问题标题】: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 示例应用程序。