我使用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:完成
图片:下载突然停止:
任何想法:我使用后台提取,因此不确定消息中的客户端是iOS8还是我的应用程序。 每次下载任务返回后,我将tmp文件复制到文件中的mp4并调用
[session finishTasksAndInvalidate];
如果其中一些下载任务失败,那么我注意到会话永远不会完成并被卡住。 当我进行另一次提取时,我得到所有这些旧的下载任务和旧会话。
答案 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