繁体   English   中英

UIWebView和NSURLCache有麻烦的关系

[英]UIWebView and NSURLCache have a troubled relationship

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

  1. 在适当的条件下加载本地资产以代替远程资产
  2. 如果没有本地资产或它们已过时,请照常加载远程资产
  3. 允许网络视图“返回”,而无需从服务器重新加载它的html

因此,为了处理#1和#2,我实现了一个自定义子类NSURLCache 当webview请求资产时,它将被调用,而我可以代替本地发送,从而中止资产的服务器调用。 我什至有一个带有时间戳的系统,它知道本地版本是否旧,以找出要使用哪个版本。

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

因此,我尝试在我的自定义NSURLCache类中强制缓存HTML。 它似乎可以正常工作,并用我想要的HTML返回NSCachedURLResponse的实例,但是UIWebView仍然无法注意到并从服务器将其加载。 经过一番搜索后,我发现UIWebView和URL缓存存在一些“不一致”之处,我想这就是其中之一。 适用于资产,但不适用于构成要显示的页面的HTML。

因此,我决定,既然这可能行不通,请手动执行。 我创建了一个url堆栈,并手动获取了它们的数据,并使用loadData:MIMEType:textEncodingName:baseURL:加载了它们。 瞧,看起来效果很好! 我现在可以返回,Web视图委托将拦截加载,并告诉它加载我的手动获取的数据,并且服务器不会被命中。

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

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

  1. UIWebView忽略服务器Cache-Control标头中的HTML内容
  2. UIWebView向主HTML请求请求一个NSCachedURLResponse ,但是随后将其忽略并丢弃。
  3. UIWebViewNSURLCache询问资产是否已通过请求加载,但是在加载HTML或数据时,它会完全绕过缓存并直接向远程服务器请求。

所以首先,有人看到这些问题的解决方案了吗? 其次,是什么原因使我变得愚蠢而实际上不是SDK错误?

要解决您的第一个#3:

尽管这看起来有些不合常规,但如何将下载的HTML保留为纯字符串形式的NSUserDefaults对象,然后在需要时(有条件地)恢复它呢?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM