当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是不是正在工作?

Posted

技术标签:

【中文标题】当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是不是正在工作?【英文标题】: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 是否继续上传的反馈。是否有任何技术可以获取有关上传的反馈?

【问题讨论】:

【参考方案1】:

通过查看有关 NSURLSessionUploadTask 的其他 *** 帖子,我可以看到对此功能有很多困惑。以下是我发现的一些有助于减少这种混淆的反馈机制:

使用网络代理和数据包嗅探器,如 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 示例应用程序和网络服务器。

【讨论】:

以上是关于当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是不是正在工作?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序挂起时如何使用 UIApplicationLaunchOptionsLocationKey 监视地理围栏区域

应用程序在挂起时静默终止。 (用户在我的应用程序上按下锁定按钮)

NSURLSessionDownloadTask 在挂起时继续下载

应用退出或挂起时处理推送负载

原生 Android 应用程序在挂起时是不是应该释放 OpenGL 资源?

javascript 文件挂起时 SignalR 连接块