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デバッガーを使用して、物事が起こる順序は次のとおりであることがわかりました:
- セッションを作成
- を呼び出します
getTasksWithCompletionHandler
。セッションにはタスクがありません - ダウンロード タスクを開始します
- デリゲート
URLSession:didReceiveChallenge:completionHandler:
が呼び出され、完了ハンドラを呼び出しますcompletionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
- デリゲートからのログは
didWriteData:
、ID 1 のダウンロード タスクがデータをダウンロード中であることを示し、ダウンロードは Charles のステータスを受信応答本文で示します - ランダムな時点で、Charles のダウンロード ステータスが [完了] に変わり、新しいダウンロードが開始されたことを確認できます。
- デリゲート
URLSession:didReceiveChallenge:completionHandler:
が呼び出され、完了ハンドラを呼び出しますcompletionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
- デリゲートからのログは
didWriteData:
、ID 2 のダウンロード タスクがデータをダウンロード中であることを示しています。新しいダウンロードは、Charles にステータス受信応答本文で表示されます。