Недавно мы перешли с AFHTTPRequestOperation
на NSURLSessionDownloadTas
k, используя AFURLSessionManager
в AFNetworking 3
. Наши пользователи могут загружать элементы, которые могут содержать до 5000 файлов.
Эти файлы в основном имеют формат PDF и MP4 и имеют размер от 10 КБ до 1 ГБ. В рамках перехода на использование 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
}];