NSURLSession 后台任务的 NSURLCache

NSURLCache for NSURLSession background tasks

我正在尝试在我的应用程序中实现缓存,我正在使用带有后台配置的 NSURLSession 来满足我的大部分网络需求,它工作得很好,但后来我添加了一个缓存对象,会话忽略了它并始终运行到服务器

我尝试使用带缓存的默认会话实例,但系统使用了缓存

我之前已经多次阅读文档,但没有提到忽略后台任务的缓存对象

有谁知道这是一个错误还是什么

后台只支持上传下载任务,不支持数据任务。而只有个数据任务使用缓存。所以没有理由让后台会话检查缓存。

如果您想对下载进行缓存,您必须自己明确地将响应添加到共享 URL 缓存中,并在启动后台任务之前检查它是否包含缓存的响应。

有关详细信息,请参阅 NSURLCache 的文档。

哇我很久以前就问过这个问题了,还是没有答案。

说实话,我最终为此使用了 DTS 令牌。

原来NSURLSession后台配置根本不支持提现,不管你用什么任务。

这是 Apple 的设计决定,但记录很糟糕。

这是我收到的部分 DTS 回放:

I’m responding to your question about the relationship between NSURLSession background sessions and NSURLCache. You wrote:

Then i add a NSURLCache object to my configuration the NSURLSession mechanism disregards it completely.

确实如此。这是预期的行为,因为目前的情况是 NSURLSession 后台会话/从不/缓存。这有很多原因:

  • 无法完全支持URLCache属性。具体来说,我们不允许您使用 NSURLCache 的自定义 subclass,因为这需要我们将您的代码加载到系统守护进程中(请记住,这里的实际工作是由 NSURLSession 守护进程完成的,而您的应用程序是暂停,甚至终止)。

  • 即使我们将您限制为标准 NSURLCache class 的实例,事情仍然会变得棘手,因为我们希望对该缓存使用的磁盘 space 进行收费到你的应用程序。考虑到您的应用程序和 NSURLSession 守护进程之间的安全障碍,这很难协调。

  • 这里存在哲学上的脱节。 NSURLSession 后台会话旨在用于少量的大传输,而 NSURLCache 只有在进行大量小传输时才真正有用。

注意:运行 通过 NSURLSession 后台会话进行的大量小额传输可能会由于其他原因导致问题。有关这方面的更多信息,请阅读以下 DevForums 帖子:

  • NSURLSession 的恢复速率限制器

https://forums.developer.apple.com/message/42352#42352

  • 转向更少、更大的传输

https://forums.developer.apple.com/thread/14853

如果您希望 NSURLSession 工程师重新考虑此缓存设计决策,您可以随时提交错误以请求支持。请务必详细解释您的用例。

https://developer.apple.com/bug-reporting/

您的错误可能会返回为“行为正确”,但询问也无妨。

关于 bug 的主题,我想您已经查看了 NSURLSession 文档,但没有发现这个陷阱。如果是这样,非常感谢您针对您查看的文档提交错误,要求它包含有关此问题的信息。