Извлечение данных в фоновом режиме NSURLSession

#ios #iphone #xcode #ipad #nsurlsession

#iOS #iPhone #xcode #iPad #nsurlsession

Вопрос:

Я использовал [NSURLSession sharedSession] для получения данных с сервера.При получении данных, если приложение переходит в фоновый режим, и через некоторое время, если оно выходит на передний план, я получаю сообщение об ошибке «Соединение было потеряно». Итак, я реализовал получение данных в фоновом режиме и использовал beginBackgroundTaskWithExpirationHandler . Но проблема в том, что через некоторое время приложение перезапускается с самого начала, поскольку я завершил фоновую задачу, которая мне не нужна.Есть ли способ извлечения данных, когда данные загружаются, и приложение переходит в фоновый режим, и при открытии приложения оно должно показывать страницу, которую оно предварительно отображало перед переходом в фоновый режим.

 [self beginBackgroundUpdateTask];
    
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
^(NSData * _Nullable responseData,
  NSURLResponse * _Nullable urlResponse,
  NSError * _Nullable error) {
     if (error) {
     NSLog(@"dataTaskWithRequest error: %@", error);
}

else{
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)urlResponse;
        if([httpResponse statusCode ]>=200 amp;amp; [httpResponse statusCode]<300)
         {
             //Do UI related things
         }
         else
         {
          //Display error here
         }
[self endBackgroundUpdateTask];
    }]resume];


- (void) beginBackgroundUpdateTask
{
 backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: backgroundUpdateTask];
 backgroundUpdateTask = UIBackgroundTaskInvalid;
}
 

Комментарии:

1. Не уверен, что у меня есть последний вопрос — это связано с проблемами с фоновой задачей или с восстановлением состояния приложения? Взгляните на сохранение пользовательского интерфейса вашего приложения в документации по запускам

2. @ATV Речь идет о получении данных приложения в фоновом режиме. При извлечении данных, если приложение переходит в фоновый режим, я получаю ошибки потери соединения из-за асинхронного запроса, который не извлекает данные в фоновом режиме. Для этого я использовал beginBackgroundUpdateTask. Но использование этого убивает мое приложение и не восстанавливает состояние viewcontroller, которое отображалось до перехода в фоновый режим. Следовательно, приложение всегда запускается с самого начала из-за beginBackgroundUpdateTask. Как показать viewcontroller, который отображался ранее

Ответ №1:

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

Когда запрос завершится:

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