6

バックグラウンドで NSURLSession セッションを実行しており、NSURLDownloadTaskDelegate コールバックの 1 つから JSON 応答を取得する方法を見つけようとしています。JSON 応答を受け入れるようにセッションを構成しました。

NSURLSessionConfiguration *backgroundSession = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.Att.Locker.BackgroundUpload"];
backgroundSession.HTTPAdditionalHeaders = @{ @"Accept":@"application/json"};
session = [NSURLSession sessionWithConfiguration:backgroundSession delegate:uploader delegateQueue:nil];

次のコールバックを使用して、NSURLSessionDownloadTasks の JSON 応答を簡単に解析できます。JSON 応答を NSURL の形式でサンドボックスに書き込みます。

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location  {

  //Reading the Json response from the sandbox using the NSURL parameter
}

私の問題は、上記のコールバックが呼び出されないというエラーが発生した場合、ダウンロードが成功した場合にのみ呼び出されるように見えることです。バックグラウンド セッションを使用しているため、NSURLSessionDataDelegate コールバックを使用できません。NSURLSessionDownloadTaskDelegate と NSURLSessionTaskDelegate のみを使用できますが、次のコールバックを使用してタスク応答を取得できます。応答に JSON が表示されません。

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {


NSHTTPURLResponse *response = (NSHTTPURLResponse *)downloadTask.response;
NSDictionary *httpResponse = [response allHeaderFields];

NSLog(@"Response Header Fields:%@",[httpResponse allKeys]);
}

NSURLConnectionには、JSON 応答を取得するために使用できるNSDataオブジェクトを提供するdidReceiveDataパラメータがあります。NSURLDataTask以外のNSURLSessionのデリゲート コールバックではそれが見られませんが、バックグラウンドでデータ タスクを使用できないため、JSON 応答を取得するにはどうすればよいでしょうか? どんな助けでも大歓迎です

編集:

私は通常、アプリをバックグラウンドで実行しているときにこの問題が発生します (ほとんどの場合、一時停止されているだけでなく、メモリが追い出されている場合)。appDelegate にコールバックを実装し、セッションに再関連付けできます。didFinishDownloadingToURL は、タスクが正常に完了した場合にのみ呼び出されると思いますが、タスクが失敗した場合、呼び出される保証はありませんが、一方 didCompleteWithError は、障害が発生するたびに呼び出されます

4

1 に答える 1