我一直在我的应用程序上注意到与 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 上,状态为 Receiving response body - 在某个随机点,我可以看到 Charles 上的下载状态更改为 Complete,并开始了新的下载
- 调用委托
URLSession:didReceiveChallenge:completionHandler:
,我调用完成处理程序completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
- 来自委托的日志
didWriteData:
显示 id 为 2 的下载任务正在下载数据,新的下载显示在 Charles 上,状态为 Receiving response body