2016-07-11 6 views
1

アプリケーションがバックグラウンドに入る場合(ホームボタンを押すなど)、インプロセスNSURLSessionTasksを正しく処理しようとしています。私は現在インプロセス・タスクをバックグラウンド・キューにコピーする方法を採用しています(下のコードを参照)。私はしかし、バックグラウンドタスクが不規則に動作しており、必ずしも終了していないことがわかりました。私が間違っているかもしれないことを見分けることはできますか?最良のアプローチについてアドバイスしてください。フォアグラウンドから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

背景セッションでは、あなたのアプリケーションが実行されていない間、あなたがバックグラウンドでコンテンツのアップロードとダウンロードを実行してみましょう。バックグラウンドセッション構成を作成するには、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"); 
}]; 

私の答えを参照してください。How to keep downloading new images in background even if user force quits the app in iOS objective C?

+2

これは「前景NSURLSessionからのバックグラウンドNSURLSessionへの移動 - 処理中のタスクの処理」への良い答えではないと思われます。その答えはバックグラウンド転送の簡単な紹介です。それが質問の意図だった場合は、質問を更新する必要があります。 – Andi

関連する問題