2016-07-11 2 views
1

Я пытаюсь правильно обрабатывать незавершенные NSURLSessionTasks в случае, если приложение входит в фоновый режим (например, с помощью кнопки home нажмите). В настоящее время я использую подход копирования задач в процессе в фоновый режим (см. Код ниже). Однако я нахожу, что фоновые задачи ведут себя беспорядочно и не всегда заканчиваются. Может ли какое-нибудь пятно, что я могу сделать неправильно/советую по наилучшему подходу?Перемещение в фоновый режим NSURLSession с переднего плана NSURLSession - Обработка задач в процессе

- (void)appWillResignActive : (NSNotification *)notification { 
    UIApplication *app = [UIApplication sharedApplication]; 

    // Register expiring background task 
    __block UIBackgroundTaskIdentifier bgTaskId = 
    [app beginBackgroundTaskWithExpirationHandler:^{ 
     bgTaskId = UIBackgroundTaskInvalid; 
    }]; 

    [self switchToBackground]; 
    [app endBackgroundTask:bgTaskId]; 

} 

- (void)appWillBecomeActive : (NSNotification *)notification { 
    [self switchToForeground]; 
} 

- (void)switchToBackground 
{ 
    NSLog(@"Switch to background line 217 Network Manager"); 
    if ([state isEqualToString: kdownloadManagerStateForeground]) { 
     [urlSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 
      for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { 
       [downloadTask cancelByProducingResumeData:^(NSData *resumeData) { 
        NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithResumeData:resumeData]; 
        [downloadTask resume]; 
       }]; 
      } 
     }]; 

     state = kdownloadManagerStateBackground; 
    } 
} 

- (void)switchToForeground 
{ 
    if ([state isEqualToString: kdownloadManagerStateBackground]) { 
     [backgroundSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 
      for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { 
       [downloadTask cancelByProducingResumeData:^(NSData *resumeData) { 
        NSURLSessionDownloadTask *downloadTask = [self.urlSession downloadTaskWithResumeData:resumeData]; 
        [downloadTask resume]; 
       }]; 
      } 
     }]; 

     state = kdownloadManagerStateForeground; 
    } 
} 
+0

Вы хотите продолжить загрузку в фоновом режиме r8? –

+0

Точно вправо - продолжить в фоновом режиме. – GuybrushThreepwood

+0

Пожалуйста, проверьте мой ответ. –

ответ

0

Фоновые сеансы позволяют выполнять загрузку и загрузку контента в фоновом режиме, в то время как ваше приложение не работает. Вы можете создать конфигурацию фонового сеанса, вызвав метод backgroundSessionConfiguration: в классе NSURLSessionConfiguration.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
NSURLSessionConfiguration *sessionConfig; 
float timeout = 5 * 60.0f; 

BOOL iOS8OrNew = [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0; 
if (iOS8OrNew) { 
    sessionConfig = [NSURLSessionConfiguration  backgroundSessionConfigurationWithIdentifier:identifier]; 
    request.timeoutInterval = timeout; 
} 
else { 
    sessionConfig = [NSURLSessionConfiguration  backgroundSessionConfiguration:identifier]; 
    sessionConfig.timeoutIntervalForRequest = timeout; 
} 

sessionConfig.HTTPMaximumConnectionsPerHost = 10; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfig]; 

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request]; 


[manager setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession * _Nonnull session) { 
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
if (appDelegate.backgroundSessionCompletionHandler) { 
    void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler; 
    appDelegate.backgroundSessionCompletionHandler = nil; 
    completionHandler(); 
} 
NSLog(@"All tasks are finished"); 
}]; 

Для получения дополнительной информации см мой ответ: How to keep downloading new images in background even if user force quits the app in iOS objective C?

+2

Я не думаю, что это хороший ответ на вопрос «Перемещение на задний план NSURLSession с переднего плана NSURLSession - обработка задач в процессе» - ответ просто дает краткое введение в перенос фона. Если это было намерение вопроса, может быть, вопрос должен быть обновлен. – Andi