自从升级到iOS 6以来,我们看到Safari的web视图可以自由缓存$。ajax调用。这是在一个PhoneGap应用程序的上下文中,所以它使用Safari WebView。我们的美元。ajax调用是POST方法,我们有缓存设置为false {cache:false},但这仍然发生。我们尝试手动添加一个时间戳到头部,但它没有帮助。
我们做了更多的研究,发现Safari只返回具有静态函数签名的web服务的缓存结果,并且在每次调用之间不会改变。例如,想象一个函数是这样的:
getNewRecordID(intRecordType)
这个函数一遍又一遍地接收相同的输入参数,但它每次返回的数据应该是不同的。
苹果一定是急于让iOS 6运行得令人印象深刻,他们对缓存设置太满意了。有人在iOS 6上看到过这种行为吗?如果是的话,到底是什么原因造成的呢?
我们发现的解决方法是修改函数签名,像这样:
getNewRecordID(intRecordType, strTimestamp)
然后总是传递一个TimeStamp参数,并在服务器端丢弃这个值。这就解决了这个问题。
从我自己的博客文章iOS 6.0缓存Ajax post请求:
如何修复:有多种方法可以防止缓存请求。推荐的方法是添加一个无缓存头。事情是这样的。
jQuery:
检查iOS 6.0并像这样设置Ajax头:
$.ajaxSetup({ cache: false });
ZeptoJS:
检查iOS 6.0并像这样设置Ajax头:
$.ajax({
type: 'POST',
headers : { "cache-control": "no-cache" },
url : ,
data:,
dataType : 'json',
success : function(responseText) {…}
服务器端
Java:
httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
确保在将任何数据发送到客户端之前将其添加到页面顶部。
.NET
Response.Cache.SetNoStore();
Or
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
PHP
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
我在iPad 4/iOS 6上遇到的问题:
我的请求包含:Cache-Control:no-cache
//asp.net's:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
添加缓存:false到我的jQuery ajax调用
$.ajax(
{
url: postUrl,
type: "POST",
cache: false,
...
只有这招管用:
var currentTime = new Date();
var n = currentTime.getTime();
postUrl = "http://www.example.com/test.php?nocache="+n;
$.post(postUrl, callbackFunction);