带有标识符的背景 URLSession 的问题

Posted

技术标签:

【中文标题】带有标识符的背景 URLSession 的问题【英文标题】:Issues with A background URLSession with identifier 【发布时间】:2016-05-10 13:13:54 【问题描述】:

我在我的项目中尝试使用此代码在后台下载大文件,它工作正常。我开始在 UIViewController 中下载。如果我转到另一个视图并返回 UIViewController ,它会停止重新加载进度条。

我遇到了带有标识符的背景 URLSession 已经存在的问题!。我想在每次加载 UIViewController 时创建新会话。我想在关闭视图控制器时使所有后台会话无效。我尝试了所有可能的方法来解决这个问题,但没有成功。

Click Here

【问题讨论】:

【参考方案1】:

当您创建后台会话时,您正在做两件事:

告诉 nsurlsessiond(后台守护进程)创建会话。 在您的应用中创建一个连接到该会话的本地会话。

标识符的目的是在您的应用被操作系统终止时允许您的应用重新连接到外部会话(由 nsurlsessiond 控制)。

据我所知,您的应用通常不可能自愿将其会话与后台会话分离。因此,当您的应用程序尝试创建具有相同标识符的会话时,突然有两个会话都试图与 nsurlsessiond 中的同一个外部会话进行对话,并且事情变得非常错误。这不是使用 API 的受支持方式。

后台会话对象必须在您的应用运行的整个过程中保持活动状态。不要试图在一次启动中处理它并重新创建它。除非您的应用重新启动,否则您不应创建具有相同 ID 的会话。

但是请注意,如果您的应用重新启动以处理后台事件(仅限 ios),当您调用事件提供的完成处理程序时,您的应用的本地会话确实会失效,如果您的应用需要创建它之后做任何事情。这是我知道后台会话停止与 nsurlsessiond 中的后台会话关联的唯一情况,因此这是您应该在一次启动中两次创建具有相同 ID 的会话的唯一情况(一次当您'被要求处理后台事件,然后可能会在您收到 didFinishLaunching 调用以指示用户将您的应用置于前台时再次处理)。

【讨论】:

谢谢。我试试。 :-)

以上是关于带有标识符的背景 URLSession 的问题的主要内容,如果未能解决你的问题,请参考以下文章

无法从 URLSessionTaskDelegate 获取数据

完成后在后台下载并唤醒应用程序

未调用 URLSession 委托成功方法,但没有错误

watchOS 上的后台 URLSession - 周期是啥?

后台应用刷新对后台 URLSession 有影响吗?

URLSession 对象是资源密集型的吗?