许多带有后台会话的任务(NSURLSessionDownloadTask)导致使用 AFNetworking 失败

Posted

技术标签:

【中文标题】许多带有后台会话的任务(NSURLSessionDownloadTask)导致使用 AFNetworking 失败【英文标题】:Many tasks (NSURLSessionDownloadTask) with a background session causes failure using AFNetworking 【发布时间】:2016-12-18 02:45:46 【问题描述】:

我们最近使用AFNetworking 3 中的AFURLSessionManagerAFHTTPRequestOperation 迁移到NSURLSessionDownloadTask。我们的用户可以选择下载最多包含大约 5,000 个文件的项目。

这些文件主要是 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

];

【问题讨论】:

我只想对新用户说,这是一个格式很好的问题。希望我能帮助你更多。 【参考方案1】:

IIRC,NSURLSession 如果您尝试在会话中添加超过几十个任务,则会在火焰中爆炸。当你达到 500 时,你几乎可以保证打破它。这是一个已知的错误,因为 Stack Overflow 上的其他人已经遇到了它并提交了关于它的错误。也就是说,请提交错误,因为 Apple 获得的关于该问题的错误越多,其优先级就越高。

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

【讨论】:

以上是关于许多带有后台会话的任务(NSURLSessionDownloadTask)导致使用 AFNetworking 失败的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 是不是支持后台任务? - IOS 7

如何区分后台会话中的下载任务?

ios - 在后台创建会话下载任务

后台上传大量数据

URLSession 下载任务委托仅在所有任务完成后调用

SIGABRT:后台会话不支持从 NSData 上传任务