使用后台配置时 NSURLSessionDownloadTask 不断重试

2024-06-21

当涉及到缓慢的后端和使用后台配置下载数据时,我遇到了问题。

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
_backgroundSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *downloadTask = [_backgroundSession downloadTaskWithURL:URL];
[downloadTask resume];

如果连接已建立,但发送回数据的时间超过 60 秒,则会发生超时。没事儿。然而,我经历的行为是我没有收到错误。 Session 只是发出一个新的请求。 “再给我数据”。我不知道这种情况发生在哪里。据我所知,不在我的代码中,也没有调用委托方法。我只能访问服务器日志。服务器大约需要 68 秒才能发回数据,但应用程序会忽略它,因为它正在等待新请求。

一种解决方案是增加超时值。但我不喜欢它,它只适用于 iOS 7。不适用于 iOS 8。

sessionConfig.timeoutIntervalForRequest = 10 * 60.0;

有人对此有任何见解吗? 我找到了这个关于后台会话超时问题的链接 https://stackoverflow.com/questions/20505858/nsurlsessionconfiguration-timeoutintervalforrequest-doesnt-seem-to-work-with-th这里在 stackoverflow 上。已经 10 个月了,但还没有解决方案,只有人们同意。


从iOS8开始,后台模式下的NSUrlSession如果服务器没有响应就不会调用这个委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error下载/上传无限期保持空闲状态。当服务器没有响应时,在 iOS7 上调用此委托会出现错误。

一般来说,如果线路出现问题,NSURLSession 后台会话不会导致任务失败。相反,它会继续寻找运行请求的好时机并在那时重试。这将持续到资源超时到期(即用于创建会话的 NSURLSessionConfiguration 对象中的 timeoutIntervalForResource 属性的值)。该值当前的默认值为一周!换句话说,iOS7中超时失败的行为是不正确的。在后台会话的上下文中,更有趣的是不要因为网络问题而立即失败。所以从iOS8开始,NSURLSession任务即使遇到超时和网络丢失也会继续。但是,它会继续,直到达到 timeoutIntervalForResource。

所以基本上 timeoutIntervalForRequest 在后台会话中不起作用,但 timeoutIntervalForResource 可以。

Source: 苹果论坛 https://forums.developer.apple.com/thread/22690

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用后台配置时 NSURLSessionDownloadTask 不断重试 的相关文章

随机推荐

  • 我可以将 CUDA 与非 NVIDIA GPU 一起使用吗? [复制]

    这个问题在这里已经有答案了 我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法 我尝试安装 MCUDA 和 gpuOcelot 但安装似乎遇到一些问题 我已经浏览了中给出的答案如何使用软件实现在没有 GPU 的情
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • 在 Mercurial (Hg) 中,列出自修订版 4822 以来我修改的所有文件的好方法是什么?

    在将一两个功能推送到所有生产服务器之前 我可能会进行两周的开发工作 并且由于这是一个 Ruby on Rails 项目 因此可以修改许多文件 那么使用 Mercurial 作为源代码控制 有没有一个好方法来列出我在当前版本和修订版 4822
  • 警告:在 Visual Studio 2015 中创建跨平台 Xamarin 空白应用程序(Xamarin.Form 便携式)

    每当我尝试创建上述类型的新项目时 我都会收到以下 4 个警告 预更新 Nuget 1 Warning IDE0006 Error encountered while loading the project Some project feat
  • SSRS - 组表达总数总计

    我的小组总数是一个减去最后一个的表达式 Hours1 从一开始的价值 Hours1 团体的价值 EquipmentName1 数据集 dataset1 我需要一个总计 即每件装备的组表达总计 我无法使用相同的公式从数据集 dataset1
  • 安装solr并索引mysql

    任何人都可以帮助我安装 solr 并将其配置到 mysql 表 我已经尝试了几乎所有教程 我尝试了 Jetty 也尝试了 tomcat 仍然收到诸如数据处理程序未定义或找不到 solr 之类的错误 已经一周了 我我一整天都在努力 为了让 s
  • GWT EditTextCell:如何增加EditTextCell中可编辑文本框的宽度?

    我在我的项目中使用GWT2 3 当用户单击 editableTextCell 时 我想增加 editableTextBox 的宽度 问题是我的列宽是 200 Px 当用户单击 editableTextCell 时 EditableTextC
  • 是否有在生产中运行的 Agda 代码示例? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 Firebase 实时数据库 + 存储加载图像

    我正在使用 Firebase 文档 react redux firebase 中的 create react app 创建类似汽车图片库的东西 图像信息存储在 Firebase 实时数据库中 但实际图像文件存储在 Firebase 存储中
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 无法卷曲 git 标签

    我想通过命令行卷曲 git 标签 curl O http someurl 但是当我尝试解压文件时它被破坏了 有谁知道问题是什么 You can curl来自 GitHub 等 git 存储库托管服务的 git 标签 因为它有专用压缩包服务
  • 如何顺序访问字典?

    我想以元素存储在字典中的方式访问字典 有人可以帮我做这件事吗 提前致谢 字典将其值存储在由键或更精确地由键的哈希值索引的结构中 这就是他们速度很快的原因 他们不需要搜索值 他们只需获取键的值并直接查找值 在大多数情况下 只有在发生冲突的键哈
  • 第二次尝试刷新令牌时如何修复“格式错误的身份验证代码”?

    我正在开发一个带有 Angular 和 Cordova 插件的 Android 应用程序 我想将其与 Google 身份验证集成 我已经安装了cordova 插件 googleplus https github com EddyVerbru
  • MySQL - 连接 a 或 b

    假设我有一个TABLE a其中一个COLUMN data是一个join其他 2 张桌子 TABLE b and TABLE c 因为我想得到一个COLUMN info in b or c 事情是a data将匹配only with b da
  • Laravel 5 Socialite - cURL 错误 77:设置证书验证位置时出错

    我正在 Laravel 5 中使用社交名流来设置 facebook 登录 我仔细按照说明进行操作 直到出现以下错误 cURL error 60 SSL certificate problem unable to get local issu
  • Powershell 使用 ConvertFrom-Csv 解析带有换行符的管道 CSV 数据

    当尝试解析字段内带有换行符的 CSV 数据时 ConvertFrom Csv 将无法正常工作 这是一个例子 test csv name address John Doe 123 Easy Way Apt 10 Somewhere USA J
  • 使用后台配置时 NSURLSessionDownloadTask 不断重试

    当涉及到缓慢的后端和使用后台配置下载数据时 我遇到了问题 NSURLSessionConfiguration sessionConfig NSURLSessionConfiguration backgroundSessionConfigur