Многие задачи (NSURLSessionDownloadTask) с фоновым сеансом вызывают сбой при использовании AFNetworking.

Недавно мы перешли с AFHTTPRequestOperation на NSURLSessionDownloadTask, используя 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

}];

person Matt    schedule 18.12.2016    source источник
comment
Я просто хотел сказать, что для нового пользователя это был превосходно отформатированный вопрос. Хотел бы я помочь вам больше.   -  person Suit Boy Apps    schedule 18.12.2016


Ответы (1)


IIRC, NSURLSession взрывается, если вы пытаетесь добавить в сеанс более нескольких десятков задач. К тому времени, когда вы доберетесь до 500, вы почти гарантированно сломаете его. Это известная ошибка, так как другие люди на Stack Overflow столкнулись с ней и сообщили об ошибках. Тем не менее, пожалуйста, сообщите об ошибке, потому что чем больше ошибок Apple получит по этой проблеме, тем выше будет ее приоритет.

Обычным обходным решением является сохранение внешней очереди ожидающих запросов, а затем добавление задач в сеанс по мере выполнения других задач.

person dgatwood    schedule 24.12.2016