2

NSURLSession に関連するアプリでの奇妙な動作に気付きました。

バックグラウンド構成で NSURLSession を使用してダウンロードを開始すると、ダウンロードは問題なく開始されますが、ある時点で、明らかにランダムで、数秒間停止し、他のデリゲートを呼び出さずに再起動します

-URLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExpectedToWrite:

リセットされたバイト数で。

誰が何が起こっているのか教えてもらえますか?

セッションを初期化する方法は次のとおりです

if([[[UIDevice currentDevice]systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending)
{
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionId];
}
else
{
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionId];
}

sessionConfiguration.HTTPMaximumConnectionsPerHost = kSimultaneousDownloads;
[sessionConfiguration setSessionSendsLaunchEvents:YES];
sessionConfiguration.discretionary = NO;

self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:self.backgroundQueue];

- 編集 -

私はRobの提案に従い、CharlesとxCodeデバッガーを使用して、物事が起こる順序は次のとおりであることがわかりました:

  1. セッションを作成
  2. を呼び出しますgetTasksWithCompletionHandler。セッションにはタスクがありません
  3. ダウンロード タスクを開始します
  4. デリゲートURLSession:didReceiveChallenge:completionHandler:が呼び出され、完了ハンドラを呼び出しますcompletionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
  5. デリゲートからのログはdidWriteData:、ID 1 のダウンロード タスクがデータをダウンロード中であることを示し、ダウンロードは Charles のステータスを受信応答本文で示します
  6. ランダムな時点で、Charles のダウンロード ステータスが [完了] に変わり、新しいダウンロードが開始されたことを確認できます。
  7. デリゲートURLSession:didReceiveChallenge:completionHandler:が呼び出され、完了ハンドラを呼び出しますcompletionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
  8. デリゲートからのログはdidWriteData:、ID 2 のダウンロード タスクがデータをダウンロード中であることを示しています。新しいダウンロードは、Charles にステータス受信応答本文で表示されます。
4

1 に答える 1

2

いくつかの提案:

  • ここに関連するリダイレクトまたは認証チャレンジはありますか? それらのデリゲートを実装して、そこで何か興味深いことが起こっているかどうかを確認しましたか?

  • 接続で実際に何が起こっているかを確認するために、 Charlesと一緒にこれを見てみましたか?

    これは、動作が接続で実際に起こっていることによるものなのか、クライアント側のコードに起因する何らかの症状によるものなのかを診断するのに役立ちます。

  • 最後に、didWriteDataタスク ID のログです (バックグラウンド セッションでは、アプリの前回の実行で開始されたダウンロードが、次にアプリを実行したときに終了する可能性があるため、混乱する可能性があるため)。

個人的には、この最後の問題は、バックグラウンド セッションを使い始めたときに最も気になった問題です。私たちは、デバッガーでアプリを実行し、アプリを停止し、後で再実行することに非常に慣れており、以前のセッションの影響はほとんどありません。ただし、デバイス/シミュレーターからアプリを実際に削除しない限り、これらの古い要求が残っているため、バックグラウンド セッションは厄介です。

于 2014-12-03T19:14:05.450 に答える