5

我使用 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:完成

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

图片:下载突然停止:

图片:下载突然停止: 图片:下载突然停止:

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

[session finishTasksAndInvalidate];

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

4

2 回答 2

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;
于 2017-06-14T15:59:35.160 回答
0

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

于 2017-06-28T13:44:03.700 回答