Фоновая загрузка iOS с использованием NSURLSessionConfiguration - PullRequest
0 голосов
/ 18 мая 2018

Я реализовал код для загрузки кусков размером 1-2 МБ в пакете из 20. После завершения сеанса первого запроса на загрузку 20 будет установлен новый пакет из 20 запросов в сеансе.Я проверил это на реальном устройстве в консольном журнале и нашел это.

default 15:56:03.627080 +0800   xyz __nw_socket_service_writes_block_invoke sendmsg(fd 14, 31 bytes): socket has been closed
default 15:56:03.671468 +0800   mediaserverd    -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.xyz with pid '1447' is now Background Suspended. Background entitlement: NO
default 15:56:03.671804 +0800   mediaserverd    1067: pid 1447(xyz)
default 15:56:03.672156 +0800   mediaserverd    3138: sid:0x1a653, xyz(1447), 'prim' new state = Background Task Suspended
default 15:56:03.673578 +0800   locationd   Client com.xyz disconnected
default 15:56:03.694200 +0800   symptomsd   1447 com.xyz: BackgroundTaskSuspended (most elevated: BackgroundTaskSuspended)
default 15:56:03.716198 +0800   symptomsd   Entry, display name com.xyz uuid 02184FD5-F48B-3EF7-B2B6-98AB05145DB9 pid 1447 isFront 0

Иногда возникает эта проблема.

Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSErrorFailingURLKey`enter code here`

Код = 2 связан с ресурсами устройства.

Мой вопрос: можем ли мы загрузить и запросить дополнительные файлы в фоновом режиме после загрузки пакета.Или фоновый режим работает только по текущему запросу и приостанавливает работу приложения, но продолжает загружать файл, упомянутый в отправленной задаче, в пакетном режиме.

Вот код для задания BG,

  if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
        backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[[NSBundle mainBundle] bundleIdentifier]];
    } else {
        backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"downloadmanager"];
    }


backgroundConfiguration.discretionary = YES;
backgroundConfiguration.sessionSendsLaunchEvents = YES;
self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:NSOperationQueue.mainQueue];

Код длядобавьте NSURLRequest в BG Task,

 NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLSessionDownloadTask *downloadTask;
            downloadTask = [self.backgroundSession downloadTaskWithRequest:request];

Обработчик фоновой задачи в AppDelegate

  func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {

        DownloadManager.shared().backgroundTransferCompletionHandler = completionHandler
        print("background task called")
    }

После отправки приложения в BG прогресс делегата прекратит печать журнала через некоторое время в консоли.И я вижу, что он частично загрузил файл.

- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

    NSLog(@"Byte downlaoded %lld of %lld ", bytesWritten, totalBytesWritten);

}

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Скачать несколько запросов в фоновой очереди это так сложно.Поэтому я рекомендую вам использовать группы рассылки.Выполните этот шаг ниже:
Шаг 1: вы можете сгруппировать 20 запросов в одну группу рассылки, чтобы составить баланс ваших запросов, вы можете установить максимальное число одновременных запросов на соединение.Я думаю, что 2 одновременных соединения являются лучшими для каждого соединения.
Шаг 2: При использовании групп рассылки.Он может уведомить после завершения всех 20 запросов, а затем вы можете создать еще одну группу рассылки для новых еще 20 запросов.

Прочтите это для групп рассылки https://www.allaboutswift.com/dev/2016/7/12/gcd-with-swfit3

0 голосов
/ 02 июля 2018

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

Но для достижения этой функциональности существует множество проблем.Если операционная система использует больше ресурсов для другого приложения, она будет отдавать приоритет этому приложению, а не вашему приложению, поэтому, когда вы запускаете фоновый сеанс и предполагаете, что для загрузки файла необходимо установить удаленное время ожидания 20 минут.Через 20 минут он выдаст сообщение об ошибке удаленного тайм-аута и не сможет загрузить 2 МБ файл в фоновом режиме, в котором он будет работать гладко при запуске приложения на переднем плане.

Вы можете найти полученный файл 2 МБ.загруженный всего за несколько секунд в режиме переднего плана, в то время как приложение находилось в фоновом режиме, оно через 20 минут выдает ошибку (удаленный тайм-аут).

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

Попробуйте это !!!!!!

Если у вас естьлюбой вопрос, пожалуйста, дайте мне знать.

0 голосов
/ 18 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...