Фоновая задача NSURLSessionConfiguration в сотовой сети не загружается

Я загружаю файл из Интернета. Размер файла большой иногда может достигать 100 МБ, иногда я хочу продолжить загрузку, пока приложение переходит в фоновый режим или когда устройство заблокировано. Для этого я использую AFNetworking 3.0

[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:myIdentifier];

Он работает нормально, пока я нахожусь на WiFi. Когда я выключаю WiFi и включаю сотовую сеть 4G, она перестает отвечать, и в результате запроса на загрузку я не получаю никаких данных. Если я использую

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

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

Я также проверил allowsCellularAccess на NSURLSessionConfiguration а также NSURLRequest и объект, который является YES, но моя загрузка не работает, когда в сотовой сети.

Вот мой полный код

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:myIdentifier];
  configuration.discretionary = YES;
  configuration.sessionSendsLaunchEvents = YES;
  AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
  NSURL *URL = [NSURL URLWithString:downloadUrl];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];
  NSLog(@"Allow Cellular Network : %d",request.allowsCellularAccess);
  NSLog(@"Allow Cellular Network for session: %d",configuration.allowsCellularAccess);
  NSLog(@"Resource timneout interval: %f",configuration.timeoutIntervalForResource);
  NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    dispatch_async(dispatch_get_main_queue(), ^{
      [self callProgressBlocksForUrl:lesson.archiveUrl withProgress:downloadProgress.fractionCompleted];
    });

  } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    NSLog(@"Getting Path for File saving");

return  [NSURL fileURLWithPath:fullPath];
   } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

     NSHTTPURLResponse * myresponse = (NSHTTPURLResponse *)response;
     NSLog(@"Video downloaded, headers: %@", [myresponse.allHeaderFields description]);


  }];

1 ответ

Вы не должны устанавливать дискреционный флаг. Это заставляет ОС ждать загрузки данных до удобного времени (что, в основном, означает, что устройство II находится в режиме ожидания: А. спит, B. включено и C. подключено к Wi-Fi).

Я предполагаю, что дискреционный флаг может создать проблему. Как сказано в документации Apple, этот дискреционный флаг разрешает загрузку, когда на устройстве есть удобное время и удобные ресурсы.