Moving to a background NSURLSession from a foreground NSURLSession - Handling Tasks in Process
<p>I am trying to correctly handle in-process NSURLSessionTasks in the event that the app enters the background (e.g from a home button press). I am currently taking the approach of copying the in-process tasks across to the background queue (see code below). I am finding however that the background tasks are behaving erratically and not always finishing. Can any spot what I might be doing wrong / advise on the best approach ?</p>

<pre><code>- (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;
    }
}
</code></pre>