许多任务(NSURLSessionDownloadTask)与背景会话导致失败使用AFNetworking

问题描述:

我们最近迁移从AFHTTPRequestOperationAFNetworking 3使用AFURLSessionManagerNSURLSessionDownloadTasķ。我们的用户可以选择下载最多可包含约5,000个文件的项目。许多任务(NSURLSessionDownloadTask)与背景会话导致失败使用AFNetworking

这些文件主要是PDF和MP4,大小范围从10 KB到1 GB。作为迁移使用NSURLSessionAFURLSessionManager的一部分,我们很高兴能够在应用程序进入后台时允许下载继续下载到系统中。但是,我们遇到的是这些下载将开始失败的

失去了连接到后台传输服务

- 或 -

“没有这样的文件的错误信息或目录“

当用户选择向上下载500个文件,这可能会发生在后台或前台的应用程序。然后我们会收到有关任何未来下载的这些错误消息,直到我们终止并重新启动应用

任何想法,如果这是一个限制的iOS和NSURLSession背景配置,或者我们应该能够得到它的工作?

我们AFURLSessionManager看起来像这样:

NSURLSessionConfiguration *configuration = 
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.our.app.identifier.downloads"]; 
[configuration setHTTPMaximumConnectionsPerHost:5]; 
AFURLSessionManager *sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
[sessionManager setCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)]; 

而任务是这样的:

NSURLSessionDownloadTask *downloadTask = [self.sessionManager downloadTaskWithRequest:[self requestForItem:item] progress:nil 

destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { 

    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    return [NSURL fileURLWithPath:[filePath stringByAppendingPathComponent:@"fileid.ext"]]; 

} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { 

    // check for error and notify the ui of completion 

}]; 
+0

我只是想为新用户说这是一个出色的格式化问题。希望我能更多地帮助你。 –

IIRC,在火焰NSURLSession爆炸,如果你尝试添加多了几个对会话有十几项任务。当你达到500时,你几乎肯定会打破它。这是一个已知的错误,因为堆栈溢出的其他人已经遇到它并提出了一些错误。也就是说,请提出一个错误,因为苹果获得的这个问题越多,它的优先级就越高。

通常的解决方法是保留挂起请求的外部队列,然后在其他任务完成时将任务添加到会话中。