我的 iPhone 应用程序嵌入了一个 UIWebView,它通过我注册的自定义 NSProtocol 处理程序加载 html。
我的问题是返回的 html 中引用的资源(也通过我的自定义协议处理程序加载)被缓存并且永远不会重新加载。特别是,我的样式表被缓存:
<link rel="stylesheet" type="text/css" href="./styles.css" />
在 UIWebView 中加载 html 的初始请求如下所示:
NSString* strUrl = [NSMutableString stringWithFormat: @"myprotocol:///entry?id=%d", entryID ]; NSURL* url = [NSURL URLWithString: strUrl]; [_pCurrentWebView loadRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]];
(请注意缓存策略设置为忽略,并且我已经验证此缓存策略会在初始加载时对页面资源的后续请求进行)
协议处理程序从数据库加载 html 并使用如下代码将其返回给客户端:
// 创建响应记录 NSURLResponse *response = [[NSURLResponse alloc] initWithURL: [request URL] MIMEType: mimeType expectedContentLength: -1 textEncodingName: textEncodingName]; // 获取对客户端的引用,以便我们可以传递数据 id 客户 = [自我客户]; // 关闭此响应数据的缓存 [客户端 URLProtocol: self didReceiveResponse:response cacheStoragePolicy: NSURLCacheStorageNotAllowed]; // 将响应中的数据设置为我们的 jfif 数据 [客户端 URLProtocol: self didLoadData:data]; 【数据发布】;
(注意响应缓存策略是“不允许的”)。
有什么想法可以让它不缓存我的 styles.css 资源吗?我需要能够在后续加载引用此文件的 html 时动态更改此资源的内容。
我认为清除共享 url 缓存会起作用,但它没有:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
确实有效但效率极低的一件事是通过添加时间戳参数来动态缓存样式表的 url:
<link rel="stylesheet" type="text/css" href="./styles.css?ts=1234567890" />
为了完成这项工作,我必须从数据库加载我的 html,搜索样式表的 url 并将其替换为每个请求都会更改的缓存清除参数。我宁愿不这样做。
我的假设是,如果我通过内置的 HTTP 协议加载我的内容是没有问题的。在这种情况下,我猜测 UIWebView 会查看 NSURLHTTPResponse 对象的 http 标头中的任何 Cache-Control 标志并遵守它们。由于我的 NSURLResponseObject 没有 http 标头(它不是 http ...),那么 UIWebView 可能只是决定缓存资源(忽略 NSURLRequest 缓存指令?)。
想法???