WKWebView 最大缓存对象大小
WKWebView max cached object size
我有一个离子电容器反应 iOS 应用程序(使用 WKWebView)与本地 html 和休息 API 内容
缓存适用于所有 API 个端点,除了一个 returns 大量数据(2MB gzipped - 16MB un)
我真的很想缓存这个,但似乎 WKWebView 能够存储的最大大小是有限制的。
如果我只是降低端点 returns 的数据左右,则缓存工作,即我得到 304s
知道限制是什么、如何提高限制或以其他方式处理吗?
编辑 从反复试验来看,限制似乎是 10MB(解压后 - 或者 gzipped ~1.2MB 的一些奇怪值)
WKWebView可缓存的限制object为10MB,解压后存储在缓存中。
似乎不可能合法地提高这个限制(<= iOS13 在撰写本文时)。
可以使用WKWebKit拦截请求,直接使用URLSession/URLCache。需要注意的是 URLCache 只会存储响应,如果响应的大小 < 缓存大小的 ~5% - 我想这与 WKWebView 不缓存响应的原因相同 >=直接10MB。因此,在我的例子中,我不得不创建一个约 600MB 的 URL 缓存来容纳它。我尝试使用 storeCachedResponse(_:for:) 手动存储响应,但在检索它时似乎会损坏 - 没有研究为什么,拥有 600MB 的缓存对于我的用例来说几乎是可以接受的。
Apple 文档指出 URL缓存仅在以下情况下缓存:
- 请求是针对 HTTP 或 HTTPS URL(或您自己的自定义
支持缓存的网络协议)。
- 请求成功(状态码在 200–299 范围内)。
- 提供的响应来自服务器,而不是来自
缓存。
- session 配置的缓存策略允许缓存。
- 所提供的URL请求object的缓存策略(如果适用)允许
缓存。
- 服务器响应中的cache-relatedheaders允许
缓存。
- 响应大小足够小,可以合理地放入缓存中。
(例如,如果您提供磁盘缓存,则响应必须为 no
大于磁盘缓存大小的大约 5%。)
edit 此外,我发现只是增加 URL 缓存大小不可靠,并且经常出现缓存未命中,即使 Etag 没有更改。相反,我创建了一个单独的小型 URL 缓存(刚好是我需要存储的数据的两倍多)。手动将缓存策略设置为 .reloadIgnoringLocalCacheData
和 store/retrieve 缓存数据。
我有一个离子电容器反应 iOS 应用程序(使用 WKWebView)与本地 html 和休息 API 内容
缓存适用于所有 API 个端点,除了一个 returns 大量数据(2MB gzipped - 16MB un)
我真的很想缓存这个,但似乎 WKWebView 能够存储的最大大小是有限制的。
如果我只是降低端点 returns 的数据左右,则缓存工作,即我得到 304s
知道限制是什么、如何提高限制或以其他方式处理吗?
编辑 从反复试验来看,限制似乎是 10MB(解压后 - 或者 gzipped ~1.2MB 的一些奇怪值)
WKWebView可缓存的限制object为10MB,解压后存储在缓存中。
似乎不可能合法地提高这个限制(<= iOS13 在撰写本文时)。
可以使用WKWebKit拦截请求,直接使用URLSession/URLCache。需要注意的是 URLCache 只会存储响应,如果响应的大小 < 缓存大小的 ~5% - 我想这与 WKWebView 不缓存响应的原因相同 >=直接10MB。因此,在我的例子中,我不得不创建一个约 600MB 的 URL 缓存来容纳它。我尝试使用 storeCachedResponse(_:for:) 手动存储响应,但在检索它时似乎会损坏 - 没有研究为什么,拥有 600MB 的缓存对于我的用例来说几乎是可以接受的。
Apple 文档指出 URL缓存仅在以下情况下缓存:
- 请求是针对 HTTP 或 HTTPS URL(或您自己的自定义 支持缓存的网络协议)。
- 请求成功(状态码在 200–299 范围内)。
- 提供的响应来自服务器,而不是来自 缓存。
- session 配置的缓存策略允许缓存。
- 所提供的URL请求object的缓存策略(如果适用)允许 缓存。
- 服务器响应中的cache-relatedheaders允许 缓存。
- 响应大小足够小,可以合理地放入缓存中。 (例如,如果您提供磁盘缓存,则响应必须为 no 大于磁盘缓存大小的大约 5%。)
edit 此外,我发现只是增加 URL 缓存大小不可靠,并且经常出现缓存未命中,即使 Etag 没有更改。相反,我创建了一个单独的小型 URL 缓存(刚好是我需要存储的数据的两倍多)。手动将缓存策略设置为 .reloadIgnoringLocalCacheData
和 store/retrieve 缓存数据。