我正在尝试解决我的两件事UIWebView
:
- 在适当的条件下加载本地资产代替远程资产
- 如果没有本地资源或它们已过时,则正常加载远程资源
- 允许 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 中有一些错误。
UIWebView
忽略Cache-Control
HTML 内容的服务器标头UIWebView
请求NSCachedURLResponse
主 HTML 请求的 's,但随后被忽略并丢弃。UIWebView
如果您通过请求加载它会询问NSURLCache
资产,但是当加载 HTML 或数据时,它会完全绕过缓存并直接从远程服务器请求它。
所以首先,有人看到这些事情的解决方案吗?其次,有什么理由说我很愚蠢而且这些实际上不是 SDK 错误吗?