• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 13:10:32 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我注意到我的应用程序出现了与 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 调试器发现事情发生的顺序是:

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



Best Answer-推荐答案


几个建议:

  • 您在此处是否有任何重定向或身份验证挑战?您是否实现了这些委托(delegate),看看那里是否发生了什么有趣的事情?

  • 你试过用 Charles 看这个吗?看看连接到底发生了什么?

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

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

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

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap