我想在我的UIWebView中解决两件事:
>在适当的条件下,加载本地资产代替远程资产
>如果没有本地远程资产或它们已过时,则正常加载远程资产
>允许webview“返回”,而无需从服务器重新加载它的html
因此,为了处理#1和#2,我实现了一个自定义子类NSURLCache.当webview请求资产时会调用它,我可以发送本地资产,中止服务器调用资产.我甚至有一个小时间戳系统,知道本地版本是否旧,以确定使用哪一个.
但是#3让我陷入了困境.似乎无论缓存控制头,UIWebView都会在返回时始终重新加载HTML.
所以我试图在我的自定义NSURLCache类中强制缓存HTML.它似乎工作,并返回NSCachedURLResponse的实例与我想要的HTML,但UIWebView无法注意到并从服务器加载它无论如何.经过一些搜索,我发现UIWebView和url缓存存在一些“不一致”,我猜这是一个.适用于资产,但对于构成它试图显示的页面的HTML来说效果不是很好.
所以我决定,因为这可能不起作用,所以手动完成.我创建了一堆url,以及我手动获取的数据并使用loadData加载它:MIMEType:textEncodingName:baseURL:.瞧,看起来效果很好!我现在可以返回,Web视图委托将拦截负载,并告诉它加载我手动获取的数据,而服务器不会被命中.
但是,我注意到NSURLCache不再用于我的资产.如果你使用loadRequest加载内容,它似乎只要求缓存资产,而不是通过正确设置baseUrl加载数据或html字符串.
因此,尽管我付出了很多努力,但我还是无法使Web视图有条件地加载本地资产并在没有命中服务器的情况下导航回来.好像我在SDK中有一些bug.
> UIWebView忽略HTML内容的服务器Cache-Control标头
> UIWebView请求主HTML请求的NSCachedURLResponse,但随后被忽略并丢弃.
>如果您使用请求加载NSURLCache,UIWebView会询问NSURLCache,但是在加载HTML或数据时,它会完全绕过缓存并直接从远程服务器请求它.
首先,有人看到这些东西的解决方案吗?第二,任何我愚蠢的原因,这些实际上不是SDK的错误?
最佳答案 要解决你的第一个#3:
虽然它可能看起来有点不正统,但是如何将下载的HTML作为扁平字符串保存到NSUserDefaults对象,并在需要时稍后(有条件地)恢复它?