gpt4 book ai didi

ios - NSURLSession 下载重新启动而不调用任何委托(delegate)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:37 25 4
gpt4 key购买 nike

我注意到我的应用程序中有一个与 NSURLSession 相关的奇怪行为。

我使用带有后台配置的 NSURLSession 开始下载,下载开始没有任何问题,但在某些时候,显然是随机的,它停止了几秒钟,然后重新启动而不调用除

之外的任何委托(delegate)
-URLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExpectedToWrite:

重置字节数。

谁能告诉我发生了什么事?

这是我初始化 session 的方式

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

最佳答案

一些建议:

  • 这里是否涉及任何重定向或身份验证挑战?您是否实现了这些委托(delegate)以查看那里是否发生了有趣的事情?

  • 你试过用Charles看这个吗?查看连接实际发生了什么?

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

  • 最后,您的 didWriteData 是否记录了任务 ID(因为在后台 session 中它可能会变得困惑,因为在应用程序的上一次运行中启动的下载可能会在您下次运行时完成应用程序)。

就我个人而言,最后一期是我第一次开始使用后台 session 时最让我受益的一期。我们已经习惯了在调试器中运行应用程序,然后停止并重新运行应用程序,而几乎没有我们之前 session 的残留影响。但是后台 session 很烦人,因为那些旧的请求会一直存在,除非你真的从设备/模拟器中删除应用程序。

关于ios - NSURLSession 下载重新启动而不调用任何委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com