iOS8:NSURLSession:NSURLSessionDataTask '客户端在收到整个响应之前关闭连接'

Posted

技术标签:

【中文标题】iOS8:NSURLSession:NSURLSessionDataTask \'客户端在收到整个响应之前关闭连接\'【英文标题】:iOS8: NSURLSession: NSURLSessionDataTask 'Client closed connection before receiving entire response'iOS8:NSURLSession:NSURLSessionDataTask '客户端在收到整个响应之前关闭连接' 【发布时间】:2014-11-26 12:43:29 【问题描述】:

我使用 ios Background FETCH n Background TRANSFER 来更新我们的应用。

当我们下载 MP4 作为大量文件的一部分时,下载可能会突然停止并出现错误:

'客户端在收到整个响应之前关闭连接'

http代码还是200。

由于公司蜂窝帐户,我们对数据没有限制,并且我们的 iPad 上只有一个应用程序,因此管理层希望我们在全新安装时下载更多数据和文件数量超过 20/30。 它们是每天发布的企业视频/pdf。

我创建了一个 NSURLSession

NSURLSession * backgroundSession_ = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]

然后对于每个指向 mp4 或 PDF 的 URL,我从我的 NSURLSession 创建一个 NSURLSessionDownloadTask

NSURLSessionDownloadTask * downloadTask_ = [backgroundSession_ downloadTaskWithURL:url_];

每个下载任务的启动恢复。 当所有返回 NSURLSession 完成时,我会在通知中告诉用户应用程序已更新。

我在我的 Mac 上使用 CHARLES PROXY 来监控下载。 这需要一段时间,因为有很多文件,而且我注意到电影似乎在流式传输,所以可能很慢。 通常它会检查已下载的内容,并且只下载最新的,但如果我进行大量下载,则说是干净安装,我注意到安静的流向 mp4 的流经常被杀死。 他们有 200 个代码,但带有消息

'客户端在收到整个响应之前关闭连接'

知道是什么原因造成的,因为它可以阻止我的 NSURLSession 完成,因此我的同步可能会处于挂起状态。

图像:OK 下载:电影流并保存到磁盘:200:完成

图片:下载突然停止:

任何想法:我使用后台获取,因此不确定消息中的客户端是 iOS8 还是我的应用程序。 在每个下载任务返回后,我将 tmp 文件复制到文档中的 mp4 并调用

[session finishTasksAndInvalidate];

如果其中一些下载任务失败,那么我注意到会话永远不会完成并卡住。 当我再次获取时,我会得到所有这些旧下载任务和旧会话。

【问题讨论】:

您找到解决此问题的方法了吗?我想知道这是否是 Charles-Bug,因为我在这里遇到了完全相同的问题...... 两年前,但根据我代码中的评论,我公司超时 - 请参阅下面的答案 太棒了!我去看看! 【参考方案1】:

有人问我是如何解决这个问题的,但两年后。

我们还缩小了电影文件以加快下载速度。 我还记得会话和配置具有单独的设置。我已经设置了一个标题,但是当 iOS 8/9 出来时失败了,因为它应该在会话中设置,而不仅仅是配置 - 但现在可能会在 iOS 10 出来时修复

//-----------------------------------------------------------------------------------
    //some movie streams time out n get
    //'http://***.com/questions/23428793/nsurlsession-how-to-increase-time-out-for-url-requests'
    //'Client closed connection before receiving entire response'

    NSLog(@"urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest:%f", urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest);
    NSLog(@"urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource:%f", urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource);

    //was 60
    //urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest = 240.0;
    urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest = 600.0;
//    urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource = 60.0;

【讨论】:

【参考方案2】:

您可以要求您的服务器伙伴将内容类型更改为视频/mpeg4,或者您可以将您的请求类型从 GET 更改为 POST

【讨论】:

以上是关于iOS8:NSURLSession:NSURLSessionDataTask '客户端在收到整个响应之前关闭连接'的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS8 中使用 NSUrlSession 使用流请求进行后台上传

NSURLSession 的 IOS9 SSL 错误

对 iOS 8 的 HTTP/2 支持

NSURLSession 啥时候运行?

NSURLSession 委托跨类拆分 - NSURLSession、NSURLUploadTask、NSURLDownloadTask

iOS开发系列-NSURLSession