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

时间:2014-11-26 12:43:30

标签: ios8 nsurlsession nsurlsessiondatatask

我使用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完成,所以我的同步可以处于某种挂起状态。

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

IMAGE:OK DOWNLOAD: MOVIE STREAMS AND SAVED TO DISK: 200: Complete

图片:下载突然停止:

IMAGE: DOWNLOAD SUDDENLY STOPS: IMAGE: DOWNLOAD SUDDENLY STOPS:

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

[session finishTasksAndInvalidate];

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

2 个答案:

答案 0 :(得分:0)

被问到我是如何解决这个问题的,但两年后才解决了问题。

我们也缩小了电影文件以加快下载速度。 我还记得会话和具有单独设置的配置。我已经设置了一个标题,但是当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;

答案 1 :(得分:0)

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