【问题标题】:How do I know if NSURLSessionUploadTask is working when application is suspended?当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是否正在工作?
【发布时间】:2016-01-31 04:39:25
【问题描述】:
当我的应用程序在前台运行时,我看到定期调用:NSURLSessionTaskDelegate -> URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
当我的应用程序移动到后台并被挂起时,对该方法的调用将停止,因此我没有关于 NSURLSessionUploadTask 是否继续上传的反馈。是否有任何技术可以获取有关上传的反馈?
【问题讨论】:
标签:
ios
nsurlsessionuploadtask
【解决方案1】:
通过查看有关 NSURLSessionUploadTask 的其他 StackOverflow 帖子,我可以看到对此功能有很多困惑。以下是我发现的一些有助于减少这种混淆的反馈机制:
使用网络代理和数据包嗅探器,如 Wireshark(有关详细信息,请参阅 this)。过滤除进出您将文件上传到的服务器的流量之外的所有流量。查找来自服务器的 HTTP 响应 (200) 和来自 iOS 设备的 FIN,ACK 以表明上传已完成并且已收到响应。您还可以使用数据包嗅探器来诊断上传问题。
使用Instruments捕获进程nsurlsessiond的网络流量
- 等待上传完成。如果您的应用程序在后台并在上传完成时挂起,那么 iOS 会将您的应用程序从挂起状态移动到在后台主动运行,并按此顺序调用以下方法:
- 通过
NSURLSessionTaskDelegate -> URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: 可能会调用一些在应用程序进入后台之前未处理的对该方法的调用
- 通过
NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
- 通过
NSURLSessionTaskDelegate -> NSURLSession:task:didCompleteWithError:
- 通过
NSURLSessionDelegate -> :URLSessionDidFinishEventsForBackgroundURLSession:
- iOS 为应用程序提供了总共 30 秒的时间在后台处理下载结束,然后暂停应用程序
我还在 github here 上放了一个非常基本的 NSURLSessionUploadTask 示例应用程序和网络服务器。