NSURLSession下载重新启动而不调用任何代理

时间:2014-12-03 15:38:49

标签: ios nsurlsession nsurlsessiondownloadtask

我注意到我的应用程序与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 debbuger,我发现订单的顺序是:

  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

1 个答案:

答案 0 :(得分:2)

一些建议:

  • 您是否在此处涉及重定向或身份验证?你是否实施了这些代表,看看那里是否有任何有趣的事情发生?

  • 您是否尝试使用Charles观看此内容以了解连接的实际情况?

    这可以用于诊断行为何时由于连接中实际发生的事件而导致客户端代码导致的某些症状。

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

就个人而言,最后一个问题是我第一次开始使用后台会话时最让我受益的问题。我们习惯于在调试器中运行应用程序,停止并稍后重新运行应用程序,而我们之前的会话几乎没有剩余效果。但是后台会话很烦人,因为除非您真正从设备/模拟器中删除应用程序,否则这些旧请求会保持不变。