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

iOS8:NSURLSession:NSURLSessionDataTask';客户端在收到整个响应之前关闭了连接';,ios8,nsurlsession,nsurlsessiondatatask,Ios8,Nsurlsession,Nsurlsessiondatatask,我使用iOS后台获取和后台传输来更新我们的应用程序 当我们下载MP4作为大量文件下载的一部分时,下载可能会突然停止并出现错误: '客户端在接收整个响应之前已关闭连接' http代码仍然是200 由于公司手机账户的原因,我们对数据没有限制,iPad上只有一个应用程序,因此管理层希望我们在一次干净的安装中下载更多的数据和文件,有时超过20/30。 它们是每天发布的公司视频/PDF 我创建了一个会话 NSURLSession * backgroundSession_ = [NSURLSessionCo

我使用iOS后台获取和后台传输来更新我们的应用程序

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

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

http代码仍然是200

由于公司手机账户的原因,我们对数据没有限制,iPad上只有一个应用程序,因此管理层希望我们在一次干净的安装中下载更多的数据和文件,有时超过20/30。 它们是每天发布的公司视频/PDF

我创建了一个会话

NSURLSession * backgroundSession_ = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]
NSURLSessionDownloadTask * downloadTask_ = [backgroundSession_ downloadTaskWithURL:url_];
然后,对于mp4或PDF的每个URL,我从NSURLSession创建一个NSURLSessionDownloadTask

NSURLSession * backgroundSession_ = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]
NSURLSessionDownloadTask * downloadTask_ = [backgroundSession_ downloadTaskWithURL:url_];
在每个下载任务上都会重新启动。 当全部返回时,NSURLSession完成,我在通知中告诉用户应用程序已更新

我在mac上使用CHARLES PROXY监控下载。 这需要一段时间,因为有很多文件,而且我注意到电影似乎流,所以可能会很慢。 通常它会检查下载的内容,只下载最新的内容,但如果我大量下载,比如说一个干净的安装,我会注意到,到mp4的流通常会被杀死。 他们有一个200码,但有信息

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

你知道这是什么原因吗?因为它会阻止我的NSURLSession完成,所以我的同步会处于挂起状态

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

图:下载突然停止:

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

[session finishTasksAndInvalidate];
如果其中一些下载任务失败,那么我会注意到会话从未结束并被卡住。
当我进行另一次抓取时,我得到了所有这些旧的下载任务和旧的会话。

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

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

//-----------------------------------------------------------------------------------
    //some movie streams time out n get
    //'http://stackoverflow.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;

您可以要求您的服务器伙伴将内容类型更改为video/mpeg4,也可以将请求类型从GET to POST更改为GET to POST

您找到解决此问题的方法了吗?我想知道这是否是一个查尔斯错误,因为我在这里有完全相同的问题…两年前,但根据我的代码中的评论,我inc timeout-见下面的答案!我去看看!