アプリがバックグラウンドに入った場合 (ホーム ボタンを押した場合など) に、インプロセスの NSURLSessionTasks を正しく処理しようとしています。私は現在、進行中のタスクをバックグラウンド キューにコピーするアプローチをとっています (以下のコードを参照)。ただし、バックグラウンド タスクが不規則に動作しており、常に終了しているとは限りません。私が間違っている可能性があることを見つけたり、最善のアプローチについてアドバイスしたりできますか?
- (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;
}
}