防止从磁盘加载的UIWebView缓存.css文件

9
在我正在进行的iPad项目中,我在应用程序中有一个UIWebView,它显示了一个链接到.css文件的.html文件。
<link rel="stylesheet" href="style.css" type="text/css">

这些文件存储在iPad本地,但是从远程服务器获取。我注意到UIWebView会将.css文件缓存几乎无限期,并且当我更改它时拒绝加载新文件。我曾经更改过文件的名称以重置缓存,但长期来看这是不可接受的。
有没有办法防止UIWebView缓存CSS文件?或者更好的方法是,在何时进行缓存和不缓存的设定吗?
2个回答

16

可以。

将你的代码修改为这样:

<link rel="stylesheet" href="style.css?version=1" type="text/css">

每次更新样式表时,都要更改版本号。由于查询字符串,浏览器会认为它是不同的页面,而您的服务器将忽略它。

如果您使用的是服务器端语言,例如PHP,还可以执行以下操作:

<link rel="stylesheet" href="style.css?version=<?php echo time(); ?>" type="text/css">

这样做会在每次刷新时更改版本,从而停止所有缓存。


这确实是个好主意!但假如我有大约15个.html文件,每个文件都有自己的<link>行,那么这仍然不能解决问题。如果只有一个文件... - Kalle
4
iPad上的本地文件不能使用服务器端语言,只能使用HTML、CSS和JavaScript。@Kelle,你可以借鉴Objective-C中@Stargazer712提出的时间建议,类似于这样:[htmlString stringByReplacingOccurrencesOfString:@"style.css" withString:[NSString stringWithFormat:@"style.css?time=%@", [[NSDate date] description]]] - Michael Kessler
你自己回答了问题。像这样进行更改需要更改15个文件。这是重复的. 似乎你没有访问服务器端语言的权限,因此可能没有快速解决方案,但如果你有服务器端语言的访问权限,你需要研究使用模板或主页面(当然取决于语言)。 - riwalk
很好。对于使用loadHTMLString加载的HTML,这非常有效,因为您可以在加载之前将版本参数插入到HTML字符串中。 - SarahR
我不建议在Web视图层面使用JS进行模板化,特别是如果您支持较早的Web视图。对于某些渲染器来说,您越少操作DOM,效果就越好。 - Erik Reppen
显示剩余2条评论

1
保持你的HTML标记和iOS代码隔离的更好方法是:
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:yourRequest];

1
[[NSURLCache sharedURLCache] removeAllCachedResponses]; 这是清除所有缓存的方法。查看ToddH在这里的答案,可以限制缓存使用的内存量,这对于提高Webview性能非常有帮助。https://dev59.com/iG035IYBdhLWcg3wW-v0 - Erik Reppen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接