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

1 回答 1

2

几个建议:

  • 您是否有任何重定向或身份验证挑战?您是否实施了这些代表以查看那里是否发生了任何有趣的事情?

  • 你有没有试过和查尔斯一起看这个,看看连接到底发生了什么?

    这对于诊断行为是由于连接中实际发生的事情而不是由我们的客户端代码引起的某些症状时很有用。

  • 最后,您是否didWriteData记录了任务 ID(因为后台会话可能会让人感到困惑,因为在应用程序的先前运行中启动的下载可能会在您下次运行应用程序时完成)。

就个人而言,最后一个问题是我第一次开始使用后台会话时最让我感动的问题。我们非常习惯于在调试器中运行应用程序,稍后停止并重新运行应用程序,而之前会话的残余影响很小。但是后台会话令人烦恼,因为除非您实际从设备/模拟器中删除应用程序,否则这些旧请求会一直存在。

于 2014-12-03T19:14:05.450 回答