#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 и создайте в нем задачу загрузки. Таким образом, когда пользователь создает фоновое изображение вашего приложения, запрос будет продолжать выполняться.
Когда запрос завершится:
- Если вы находитесь на переднем плане, немедленно прочитайте его и обработайте.
- Если загрузка завершается, когда ваше приложение работает в фоновом режиме, переместите его в папку в каталоге контейнера приложения, а затем загрузите его после того, как пользователь запустит приложение.
- Если ваше приложение перезапускается в фоновом режиме из-за завершения загрузки после завершения работы вашего приложения, переместите файл в сторону для последующего использования, а затем перезагрузите его после повторного запуска приложения пользователем.