4

我正在尝试解决我的两件事UIWebView

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

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

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

所以我试图在我的自定义NSURLCache类中强制缓存 HTML。它似乎可以工作,并返回NSCachedURLResponse带有我想要的 HTML 的实例,但是UIWebView无论如何都没有注意到并从服务器加载它。经过一番搜索,我发现 url 缓存存在一些“不一致” UIWebView,我想这是其中之一。对资产很有效,但对构成它试图显示的页面的 HTML 来说不是很好。

所以我决定,因为这可能行不通,所以手动做。我创建了一堆 url,以及我手动获取并使用loadData:MIMEType:textEncodingName:baseURL:. 瞧,它似乎工作得很好!我现在可以回去了,Web 视图委托将拦截负载,并告诉它加载我手动获取的数据,并且服务器不会被击中。

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

因此,尽管我付出了所有努力,但我无法使 Web 视图有条件地加载本地资产并在不访问服务器的情况下导航回来。似乎我在 SDK 中有一些错误。

  1. UIWebView忽略Cache-ControlHTML 内容的服务器标头
  2. UIWebView请求NSCachedURLResponse主 HTML 请求的 's,但随后被忽略并丢弃。
  3. UIWebView如果您通过请求加载它会询问NSURLCache资产,但是当加载 HTML 或数据时,它会完全绕过缓存并直接从远程服务器请求它。

所以首先,有人看到这些事情的解决方案吗?其次,有什么理由说我很愚蠢而且这些实际上不是 SDK 错误吗?

4

2 回答 2

1

要解决您的第一个问题 #3:

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

于 2010-01-20T17:34:54.543 回答
1

我已经放弃了这个。有太多的陷阱。相反,我只是通过 ajax 加载新页面。而不是[webview goBack]我有一些自定义的 javascript 来为我做一些很酷的事情[webview stringByEvaluatingJavascriptFromString:@"goBack()"]

于 2010-01-20T18:29:39.610 回答