2

アプリがバックグラウンドに入った場合 (ホーム ボタンを押した場合など) に、インプロセスの 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;
    }
}
4

1 に答える 1

0

バックグラウンド セッションを使用すると、アプリが実行されていないときにバックグラウンドでコンテンツのアップロードとダウンロードを実行できます。NSURLSessionConfiguration クラスの backgroundSessionConfiguration: メソッドを呼び出すことで、バックグラウンド セッション構成を作成できます。

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");
}];

詳細については、私の回答を参照してください: iOS 目標 C でユーザーが強制的にアプリを終了してもバックグラウンドで新しい画像をダウンロードし続ける方法は?

于 2016-07-11T11:53:38.607 に答える