我正在尝试解决UIWebView
中的两件事:
因此,为了处理#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。
UIWebView
忽略HTML内容的服务器Cache-Control
标头UIWebView
请求主要HTML请求的NSCachedURLResponse
,但会被忽略并丢弃。UIWebView
会向NSURLCache
询问资产,但在使用HTML或数据加载时,它会完全绕过缓存并直接从远程服务器请求资源。首先,有人看到这些东西的解决方案吗?第二,任何我愚蠢的原因,这些实际上不是SDK的错误?
答案 0 :(得分:1)
解决你的第一个#3:
虽然它可能看起来有点不正统,但如果将下载的HTML作为扁平字符串保存到NSUserDefaults对象,并在需要时稍后(有条件地)恢复它呢?
答案 1 :(得分:1)
我放弃了这个。有太多陷阱了。相反,我只是通过ajax加载新页面。而不是[webview goBack]
我在[webview stringByEvaluatingJavascriptFromString:@"goBack()"]