UIWebView和NSURLCache有一个混乱的关系

时间:2010-01-19 00:41:15

标签: iphone objective-c uiwebview nsurlcache

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

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

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

    但是#3让我失去了一个循环。似乎无论缓存控制标头如何,UIWebView都会在返回时重新加载HTML。

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

    然后我决定,因为这可能不起作用,所以手动完成。我创建了一堆网址,以及我手动提取并使用loadData:MIMEType:textEncodingName:baseURL:加载的数据。瞧,看起来效果很好!我现在可以回去了,Web视图委托会拦截负载,并告诉它加载我手动获取的数据,而服务器不会被命中。

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

    因此,尽管我付出了很多努力,但我无法使Web视图有条件地加载本地资产并导航回来而不会点击服务器。好像我在SDK中有一些bug。

    1. UIWebView忽略HTML内容的服务器Cache-Control标头
    2. UIWebView请求主要HTML请求的NSCachedURLResponse,但会被忽略并丢弃。
    3. 如果您使用请求加载资源,
    4. UIWebView会向NSURLCache询问资产,但在使用HTML或数据加载时,它会完全绕过缓存并直接从远程服务器请求资源。
    5. 首先,有人看到这些东西的解决方案吗?第二,任何我愚蠢的原因,这些实际上不是SDK的错误?

2 个答案:

答案 0 :(得分:1)

解决你的第一个#3:

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

答案 1 :(得分:1)

我放弃了这个。有太多陷阱了。相反,我只是通过ajax加载新页面。而不是[webview goBack]我在[webview stringByEvaluatingJavascriptFromString:@"goBack()"]

上有一些自定义的javascript来为我做很酷的事情