gpt4 book ai didi

iphone - UIWebView 和 NSURLCache 的关系很麻烦

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:16 26 4
gpt4 key购买 nike

我试图在我的 UIWebView 中解决两件事:

  1. 在合适的条件下加载本地资源代替远程资源
  2. 如果没有本地 Assets 或它们已过时,则正常加载远程 Assets
  3. 允许 web View “返回”而不需要从服务器重新加载它的 html

为了处理#1 和#2,我实现了一个自定义子类NSURLCache。它在 webview 请求 Assets 时被调用,我可以发送本地 Assets ,中止对 Assets 的服务器调用。我什至有一个小的时间戳系统,它知道本地版本是否旧,以便确定使用哪个版本。

但#3 让我陷入困境。似乎无论缓存控制 header 如何,UIWebView 返回时都会重新加载 HTML。

所以我试图在我的自定义 NSURLCache 类中强制缓存 HTML。它似乎有效,并返回带有我想要的 HTML 的 NSCachedURLResponse 实例,但 UIWebView 未能注意到并从服务器加载它。经过一番搜索后,我发现 UIWebView 和 url 缓存存在一些“不一致”,我想这就是其中之一。适用于 Assets ,但不适用于构成它试图显示的页面的 HTML。

所以我决定,既然这可能行不通,那就手动完成吧。我创建了一堆 url 和它们的数据,这些数据是我手动获取并使用 loadData:MIMEType:textEncodingName:baseURL: 加载的。瞧,它似乎工作得很好!我现在可以返回,Web View 委托(delegate)会拦截加载,并告诉它加载我手动获取的数据,这样服务器就不会受到攻击。

但是,然后我注意到 NSURLCache 不再用于我的 Assets 。如果您使用 loadRequest: 加载内容,而不是通过正确设置 baseUrl 加载数据或 html 字符串,它似乎只要求缓存 Assets 。

因此,尽管我尽了一切努力,但我无法让 Web View 有条件地加载本地 Assets 并在不访问服务器的情况下导航回来。看来我的 SDK 中有一些错误。

  1. UIWebView 忽略 HTML 内容的服务器 Cache-Control header
  2. UIWebView 为主要 HTML 请求请求 NSCachedURLResponse,但随后被忽略并丢弃。
  3. UIWebViewNSURLCache 询问 Assets ,如果你用请求加载它,但是当加载 HTML 或数据时,它会完全绕过缓存并直接从远程服务器。

那么首先,有人看到了解决这些问题的方法吗?其次,我有什么愚蠢的理由,这些实际上不是 SDK 错误?

最佳答案

解决您的第一个#3:

虽然这看起来有点不正统,但如何将下载的 HTML 作为平面字符串保存到 NSUserDefaults 对象,并在以后需要时(有条件地)恢复它呢?

关于iphone - UIWebView 和 NSURLCache 的关系很麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com