我们最近使用AFHTTPRequestOperation
中的NSURLSessionDownloadTas
从AFURLSessionManager
迁移到AFNetworking 3
k。我们的用户可以选择下载最多包含5,000个文件的项目。
这些文件主要是PDF和MP4,大小从10 KB到1 GB不等。作为使用NSURLSession
和AFURLSessionManager
迁移的一部分,我们很高兴能够在应用程序进入后台时将这些下载内容移至系统,以便继续下载。但我们遇到的是这些下载将开始失败并显示错误消息
与后台转接服务失去联系
- 或 -
"没有这样的文件或目录"
当用户选择下载超过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 :(得分:1)
NSURLSession
会爆炸。当你达到500时,你几乎可以保证打破它。这是一个已知的错误,因为Stack Overflow上的其他人遇到了它并提交了有关它的错误。也就是说,请提交一个错误,因为Apple对此问题的了解越多,其优先级就越高。
通常的解决方法是保留待处理请求的外部队列,然后在其他任务完成时将任务添加到会话中。