iOS 6のSafariは$ .ajaxの結果をキャッシュしていますか?


1072

iOS 6へのアップグレード以降、SafariのWebビュー$.ajaxは呼び出しをキャッシュする自由をとっています。これはPhoneGapアプリケーションのコンテキストにあるため、Safari WebViewを使用しています。私たちの$.ajax呼び出しがあるPOST方法と、私たちはfalseにキャッシュを設定している{cache:false}が、それでもこれが起こっています。TimeStampヘッダーに手動でa を追加しようとしましたが、役に立ちませんでした。

さらに調査を行ったところ、Safariは静的であり、呼び出しごとに変化しない関数シグネチャを持つWebサービスに対してのみキャッシュされた結果を返していることがわかりました。たとえば、次のような関数を想像してください。

getNewRecordID(intRecordType)

この関数は同じ入力パラメータを何度も受け取りますが、返されるデータは毎回異なるはずです。

彼らがキャッシュ設定に満足しすぎて印象的にiOS 6 zipを作成するには、Appleの急いでいる必要があります。他の誰かがiOS 6でこの動作を見たことがありますか?もしそうなら、正確には何が原因ですか?


私たちが見つけた回避策は、関数のシグネチャを次のように変更することでした:

getNewRecordID(intRecordType, strTimestamp)

そして、常にTimeStampパラメーターも渡して、サーバー側でその値を破棄します。これは問題を回避します。これが私のようにこの問題に15時間費やす他の貧しい魂の助けとなることを願っています!


190
これは絶対に衝撃的です。また、何かが機能しなくなった問題を解決するために数時間を費やしました。POSTを実行する(キャッシュを防止するためのヘッダーもある)AJAXログインはSafariによってキャッシュされているため、サーバーを試さなくても前回と同じJSONを返すだけです...信じられない!修正をハックする必要がありますが、POSTをキャッシュしてはいけません。
キーラン2012

16
質問に対する更新ではなく、回答としてソリューションを投稿してください。
ChrisF

50
POSTリクエストはべき等ではありません。つまり、レスポンスがレスポンスヘッダーを介してキャッシュから明確に指示されない限り、キャッシュされるべきではありません。
James M. Greene

6
Appleにこれを修正させるには、bugreport.apple.comでバグを報告してください。私は同じことをしました。
Mathias Bynens 2012

11
Mark Nottingham(IETF HTTPbisワーキンググループの議長)は、これについて興味深いブログ投稿を今日投稿しました:mnot.net/blog/2012/09/24/caching_POST
Benjamin Brizzi

回答:


447

少し調べたところ、iOS6のSafariは、Cache-Controlヘッダーを持たない、または「Cache-Control:max-age = 0」のPOSTもキャッシュすることがわかりました。

サービスコールの最後にランダムなクエリ文字列をハックする必要なく、このキャッシュがグローバルレベルで発生するのを防ぐ唯一の方法は、「Cache-Control:no-cache」を設定することです。

そう:

  • Cache-ControlまたはExpiresヘッダーがない= iOS6 Safariはキャッシュします
  • Cache-Control max-age = 0および即時Expires = iOS6 Safariがキャッシュします
  • Cache-Control:no-cache = iOS6 Safariはキャッシュしません

AppleはPOSTに関するセクション9.5のHTTP仕様からこれを利用していると思います。

このメソッドへの応答は、応答に適切なCache-ControlまたはExpiresヘッダーフィールドが含まれていない限り、キャッシュできません。ただし、303(その他を参照)応答を使用して、ユーザーエージェントにキャッシュ可能なリソースを取得するように指示できます。

したがって、理論的にはPOST応答をキャッシュできます。しかし、他のブラウザメーカーは、これまでこれが良いアイデアだとは考えていませんでした。ただし、Cache-ControlヘッダーやExpiresヘッダーが設定されていない場合、キャッシュは考慮されません。設定されている場合のみです。だからバグだと思う。

以下は、Apache構成の正しいビットで使用して、API全体をターゲットにするものです。これは、実際には何もキャッシュしたくなく、取得することもないためです。私が知らないのは、これをPOSTのためだけに設定する方法です。

Header set Cache-Control "no-cache"

更新:POSTが同じ場合のみであることを指摘しなかったので、POSTデータまたはURLを変更すれば問題ありません。したがって、他の場所で述べたように、URLにランダムなデータを追加するか、POSTデータを少し追加することができます。

更新:Apacheで次のようにしたい場合は、「キャッシュなし」をPOSTのみに制限できます。

SetEnvIf Request_Method "POST" IS_POST
Header set Cache-Control "no-cache" env=IS_POST

7
Appleがこれをどのように進めているかはわかりますが、応答にCache-ControlヘッダーやExpiresヘッダーが含まれていない場合でも、POST要求に対するキャッシュされた応答が表示されます。このインスタンスはiOS6がすべてのリクエストをキャッシュして送信するべきではありませんか これは起こっていません。
Kango_V 2012

138
引用したHTTP仕様の一部は、iOS 6のキャッシュ動作を正当化するものではありません。デフォルトの動作は、POST応答をキャッシュしないことです(つまり、「Cache-Control」ヘッダーが定義されていない場合)。動作は仕様に違反しているため、バグと見なす必要があります。xml / json api Webサービスを構築する人は、この問題を回避するために、POST応答を「Cache-control:no-cache」で修飾する必要があります。
デビッドH

39
POSTリクエストはべき等ではありません。つまり、レスポンスがレスポンスヘッダーを介してキャッシュから明確に指示されない限り、キャッシュされるべきではありません。
James M. Greene

4
デビッドが言うように、あなたが引用した文の明確な違反です。「Cache-Control or Expires header fields」がない場合、適切なそのようなヘッダーは明らかに含まれていません。しかし、あなた自身の調査はそれがそのシナリオでキャッシュすることを示しています。回答を編集してください。
マシューFlaschen

3
結果がデバイスにキャッシュされる期間を誰かが知っていますか?Safariを終了して電話を再起動しようとしましたが、まだキャッシュされています。ブラウザのキャッシュをクリアすることで機能することはわかっていますが、問題が発生したユーザーが消えるまでにどれくらいの時間がかかるのかと思います。誰もがキャッシュをクリアすることを考えているわけではない...
ダニエル・ハルクビスト2012

146

これが、壁に頭をぶつけて他の開発者に役立つことを願っています。次のいずれかにより、iOS 6のSafariがPOST応答をキャッシュできないことがわかりました。

  • リクエストヘッダーに[cache-control:no-cache]を追加する
  • 現在時刻などの可変URLパラメータを追加する
  • 応答ヘッダーに[pragma:no-cache]を追加する
  • 応答ヘッダーに[cache-control:no-cache]を追加する

私の解決策は私のJavaScriptで次のとおりでした(私のすべてのAJAXリクエストはPOSTです)。

$.ajaxSetup({
    type: 'POST',
    headers: { "cache-control": "no-cache" }
});

また、[pragma:no-cache]ヘッダーをサーバー応答の多くに追加します。

上記のソリューションを使用する場合、グローバルに設定された$ .ajax()呼び出しはすべてfalseに設定されることに注意してください。falseは$ .ajaxSetup()で指定された設定を使用しないため、ヘッダーを再度追加する必要があります。


4
これはバグの正しい解決策です。バグは、iOS 6がサーバーに送信するのではなく、キャッシュからPOSTリクエストを処理することです。バグは、POSTリクエストからの応答をキャッシュすることではありません(許可されています)。そのURIへの後続のGETリクエストのためにキャッシュから取得したPOSTリクエストへの応答が引き続き必要な場合は、このソリューションを使用します。
ニコラスシャンクス

2
これは私にとってはうまくいきますが、方法がわかりません。私はすでにajaxSetupでcache:falseを指定しており、リクエストヘッダーを確認すると、結局はCache-Control:no-cacheおよびPragma:no-cacheになりますが、iPadでは引き続きキャッシュされます。次に、ヘッダーを追加すると、{"cache-control": "no-cache"}がajaxSetupに追加され、Cache-Controlヘッダーが2倍になって "no-cache、no-cache"になり、キャッシュが停止します。ここで何が起こっているのですか?
トムWホール

完全に機能します-パラメータとしてリクエストに追加することもできます$ .ajax({type: 'POST'、headers:{'cache-control': 'no-cache'}、etc.})
George Filippakos

[pragma:no-cache]とは何ですか?プラグマキーは何に使用されますか?
ザクダンス2013年

また、これは、追加のパラメーターによる回避策ではなく、最善のアプローチだと思います。必要な場所にのみ呼び出しを追加しました。常に同じ戻り値を持つ呼び出しの場合、キャッシュはおそらくエンドユーザーにとって良いことです。
ジャーマンキウイ2013年

67

jQueryを使用していると仮定して、すべてのWebサービス要求に対する単純なソリューション:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    // you can use originalOptions.type || options.type to restrict specific type of requests
    options.data = jQuery.param($.extend(originalOptions.data||{}, { 
      timeStamp: new Date().getTime()
    }));
});

jQueryプレフィルター呼び出しの詳細については、こちらをお読みください

jQueryを使用していない場合は、選択したライブラリのドキュメントを確認してください。それらは同様の機能を持っているかもしれません。


3
それは私には機能しません、サーバーは応答します: "無効なプリミティブJSON:timeStamp" asp.net / iis 7.5
Alexandre

3
$ .ajax({"cache":false ...})はどうですか?_ = [TIMESTAMP]を追加すると機能しますか?(私はそれをテストするそのようなデバイスを所有していません)
Karussell

Karussellによって提案されたソリューションの完全な実装を投稿しました。以下の私の答えを参照してください。
Sam Shiles 2012

1
@Karussell。$ .ajax({"cache":false ...})を設定してみました。これは、iOS6でのPOSTリクエストの問題を解決しません。おそらく、ドキュメントによると、JQueryは、ポストリクエストをキャッシュするのに十分な馬鹿なブラウザはないと想定しているためです。「POSTでフェッチされたページはキャッシュされないため、jQuery.ajaxSetup()のキャッシュとifModifiedオプションは、これらのリクエストに影響を与えません。」
Brett Hannah

1
これは機能しません。投稿パラメータはマージしません。Daveの投稿がより良い解決策です。
Chris Muench、

43

PhoneGapアプリケーションでもこの問題が発生しました。getTime()次の方法でJavaScript関数を使用して解決しました。

var currentTime = new Date();
var n = currentTime.getTime();
postUrl = "http://www.example.com/test.php?nocache="+n;
$.post(postUrl, callbackFunction);

私はこれを理解するために数時間を無駄にしました。このキャッシングの問題を開発者に通知することはAppleにとって良かったでしょう。


1
またはの{cache:false}オプションとしての使用についてコメントしましたが、ドキュメントによると、これらの引数は無視されます。jQueryは投稿リクエストを「キャッシュしない」が、ブラウザを考慮しない。おそらく、より適切なオプションは、を使用してリクエストにタイムスタンプを追加することです。$.post()$.ajaxSetup()$.ajaxPrefilter()
fwielstra 2012

私はこの問題を解決するために、ほぼ5時間を費やし、最後にタイムスタンプを追加するトリックを行いますfunction send_ajax(my_data,refresh) 、ここで参照してください。.. stackoverflow.com/questions/14733772/...
rusly

42

ASP.NET Webサービスからデータを取得するWebアプリケーションで同じ問題が発生しました

これは私のために働きました:

public WebService()
{
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    ...
}

2
どうもありがとうございました!iPhoneが他のすべてのプラットフォームとはまったく異なる動作をする理由を理解しようとして、夢中になりました。このASP.NET固有のソリューションにより、時間を大幅に節約できました。
マークブリッティンガム

iOS6で動作しませんでした。スレッドの終わりに向かって私の答えを参照してください
ブライアンオグデン

1
お願いします!!!!これをIOS 6にのみ適用するための条件を設定します。コンテンツキャッシュはすべてのアプリケーションに不可欠です。
アレクサンドル

24

最後に、アップロードの問題を解決しました。

JavaScriptの場合:

var xhr = new XMLHttpRequest();
xhr.open("post", 'uploader.php', true);
xhr.setRequestHeader("pragma", "no-cache");

ではPHP

header('cache-control: no-cache');

15

私自身のブログ投稿から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");

データがクライアントに送信される前に、これをページの上部に追加してください。

。ネット

Response.Cache.SetNoStore();

または

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.


7

このJavaScriptスニペットは、jQueryおよびjQuery Mobileで適切に機能します。

$.ajaxSetup({
    cache: false,
    headers: {
        'Cache-Control': 'no-cache'
    }
});

JavaScriptコードのどこかに(jQueryがロードされた後、AJAXリクエストを実行する前に)配置するだけで役立ちます。


6

jQuery Ajaxを変更してこの問題を修正することもできます関数を関数の先頭に(1.7.1以降で)次のようにしてます(関数は7212行目から始まります)。この変更により、すべてのPOSTリクエストに対してjQueryの組み込みアンチキャッシュ機能がアクティブになります。

(完全なスクリプトは、 http://dl.dropbox.com/u/58016866/jquery-1.7.1.js。)

7221行の下に挿入:

if (options.type === "POST") {
    options.cache = false;
}

次に、以下を変更します(7497行目から)。

if (!s.hasContent) {
    // If data is available, append data to URL
    if (s.data) {
        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
        // #9682: remove data so that it's not used in an eventual retry
        delete s.data;
    }

    // Get ifModifiedKey before adding the anti-cache parameter
    ifModifiedKey = s.url;

    // Add anti-cache in URL if needed
    if (s.cache === false) {
        var ts = jQuery.now(),
        // Try replacing _= if it is there
        ret = s.url.replace(rts, "$1_=" + ts);

        // If nothing was replaced, add timestamp to the end.
        s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
    }
}

に:

// More options handling for requests with no content
if (!s.hasContent) {
    // If data is available, append data to URL
    if (s.data) {
        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
        // #9682: remove data so that it's not used in an eventual retry
        delete s.data;
    }

    // Get ifModifiedKey before adding the anti-cache parameter
    ifModifiedKey = s.url;
}

// Add anti-cache in URL if needed
if (s.cache === false) {
    var ts = jQuery.now(),
    // Try replacing _= if it is there
    ret = s.url.replace(rts, "$1_=" + ts);

    // If nothing was replaced, add timestamp to the end.
    s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
}

4
jQueryを変更したり、所有していないコードを変更したりするのは良い方法ではありません。(バージョンを更新するたびに、変更を再度行う必要があります。(または別の開発者が更新し、プログラムが機能しません))
andlrc

Appleの馬鹿を軽減するために可能な限り迅速な解決策が必要な場合、これは完全に有効なアプローチです。このソリューションは、1日に数百万のヒットを受け取る大規模サイトの問題を解決するために使用され、1つのファイルに変更を加えるだけでそれを実行できるようになりました。
Sam Shiles

これを見るとjQuery.ajaxPrefiler、ajaxリクエストを作成する直前に変更できます。より最適化された安全なコードを使用して、同じものをアーカイブできます。
andlrc

1
preFilterアプローチの問題は、フィルターを登録する必要があることです。各ページが読み込まれるときに実行される共通のスクリプトがある場合は問題ありませんが、そうでない場合は、ajaxを使用する各ページにpreFilterを設定する必要があります。私が直面したシナリオでは、7つ以上の個々のWebサイトのリソースとして使用されるJQファイルの共通の場所がありました。このバグのため、1時間に数千ポンドも失われていました。私が提案したアプローチでは、ONEファイルを変更することで、最短の時間で問題を解決できました。私は原則としてあなたに同意しますが、時には実用的である必要があります!
Sam Shiles

その後、そのファイルの最後に再度追加できます。よく解けました。あなたの会社はあなたのために幸せでなければなりません。
andlrc

5

GWT-RPCサービスの簡単な回避策は、これをすべてのリモートメソッドに追加することです。

getThreadLocalResponse().setHeader("Cache-Control", "no-cache");

私たちのほとんどは、GWTデプロイメントに何百ものリモートメソッドを持っています。すべてのリクエストにキャッシュ制御ヘッダーを設定する一般的な方法はありますか?
dirkoneill

5

これはBaz1ngaの回答の更新です。options.dataはオブジェクトではなく文字列なので、タイムスタンプを連結することに頼りました:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  if (originalOptions.type == "post" || options.type == "post") {

    if (options.data && options.data.length)
      options.data += "&";
    else
      options.data = "";

    options.data += "timeStamp=" + new Date().getTime();
  }
});

1
タイムスタンプを追加することはお勧めできません。代わりにDaveのソリューションを試してください。
ニコラスシャンクス

4

ホーム画面に追加されたWebAppsについてこの問題を解決するには、上位投票の両方の回避策に従う必要があります。新しいリクエストが今後キャッシュされないようにするには、ウェブサーバーでキャッシュをオフにする必要があります。すでにキャッシュされているリクエストを通過させるために、すべてのポストリクエストにランダム入力を追加する必要があります。私の投稿を参照してください:

iOS6-ホーム画面に追加されたwebappのキャッシュされたajax POSTリクエストをクリアする方法はありますか?

警告:サーバーのキャッシュをオフにせずにリクエストにタイムスタンプを追加することで回避策を実装した人へ。アプリがホーム画面に追加されると、すべての投稿応答がキャッシュされるようになり、Safariキャッシュをクリアしてもクリアされず、有効期限が切れていないように見えます。誰かがそれをクリアする方法がない限り、これは潜在的なメモリリークのように見えます!


すべての応答は、電話のファイルまたはメモリにキャッシュされますか?
Eydun、2012年

これは私には当てはまりませんでした。サファリからブラウジングするときも、ホーム画面に保存するときも、タイムスタンプを(投稿パラメーターではなく)URLに追加しました。
ShadeTreeDeveloper 2013年

4

iPad 4 / iOS 6 でうまくいかなかったこと:

私のリクエストに含まれるもの:Cache-Control:no-cache

//asp.net's:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)

キャッシュの追加:jQuery ajax呼び出しにfalse

 $.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);

反対票は何ですか?これは重要な情報のキャッシュです:falseがiPad4 / iOS6で仕事をしないし//asp.net'sを行います。HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
ブライアン・オグデン

後世のために:2017年現在、 $.ajax cache: false、URLにクエリパラメータ_=Date.prototype.getTime()を追加しているため、手動でタイムスタンプを追加する必要はなくなりました。
カウベルト

3

これがGWT-RPCの回避策です

class AuthenticatingRequestBuilder extends RpcRequestBuilder 
{
       @Override
       protected RequestBuilder doCreate(String serviceEntryPoint) 
       {
               RequestBuilder requestBuilder = super.doCreate(serviceEntryPoint);           
               requestBuilder.setHeader("Cache-Control", "no-cache");

               return requestBuilder;
       }
}

AuthenticatingRequestBuilder builder = new AuthenticatingRequestBuilder();
((ServiceDefTarget)myService).setRpcRequestBuilder(builder);    

2

ASP.NETでの回避策(ページメソッド、Webサービスなど)

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

1

リクエストを別の見た目にするためのキャッシュ無効化パラメーターを追加することは確かな解決策のように見えますが、実際のキャッシングが発生していることに依存するアプリケーションに悪影響を与えるため、お勧めしません。呼び出し元にキャッシュバスターを追加するよりも少し難しい場合でも、APIに正しいヘッダーを出力させることが最善の解決策です。


1
私はあなたのほとんどの状況に同意しますが、この問題の本当の解決策はAppleがHTTPを正しく実装することであると主張します。これを念頭に置いて、その時まで、私は多くの開発者が可能な限り単純なソリューションを実装したことを非難しません。私にとっては、jquery実装を変更することが最も簡単な修正でした。これにより、1つの編集を行って、サイト全体でアクティブであると確信できました。
Sam Shiles 2012

1

を使用している人のためにStruts 1、ここで問題を修正しました。

web.xml

<filter>
    <filter-name>SetCacheControl</filter-name>
    <filter-class>com.example.struts.filters.CacheControlFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>SetCacheControl</filter-name>
    <url-pattern>*.do</url-pattern>
    <http-method>POST</http-method>
</filter-mapping>

com.example.struts.filters.CacheControlFilter.js

package com.example.struts.filters;

import java.io.IOException;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;

public class CacheControlFilter implements Filter {

        public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse) response;
        resp.setHeader("Expires", "Mon, 18 Jun 1973 18:00:00 GMT");
        resp.setHeader("Last-Modified", new Date().toString());
        resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
        resp.setHeader("Pragma", "no-cache");

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void destroy() {
    }

}

1

$ .ajaxSetupの組み合わせを使用し、投稿のURL(投稿のパラメーター/本文ではなく)にタイムスタンプを追加することで、問題を解決できました。これは以前の回答の推奨に基づいています

$(document).ready(function(){
    $.ajaxSetup({ type:'POST', headers: {"cache-control","no-cache"}});

    $('#myForm').submit(function() {
        var data = $('#myForm').serialize();
        var now = new Date();
        var n = now.getTime();
        $.ajax({
            type: 'POST',
            url: 'myendpoint.cfc?method=login&time='+n,
            data: data,
            success: function(results){
                if(results.success) {
                    window.location = 'app.cfm';
                } else {
                    console.log(results);
                    alert('login failed');
                }
            }
        });
    });
});

1

問題はすでに解決されていると思いますが、Webキャッシュについてのアイデアを共有させてください。

確かに、使用する各言語、サーバー側、クライアント側で多くのヘッダーを追加できます。また、Webキャッシュを回避するために他の多くのトリックを使用できますが、常にクライアントがサーバーに接続している場所を知ることはできないと常に考えています。彼がSquidや他のキャッシング製品を使用するホテルの「ホットスポット」接続を使用しているかどうかは決してわかりません。

ユーザーがプロキシを使用して実際の位置などを非表示にしている場合、キャッシュを回避する実際の唯一の方法は、未使用の場合もリクエストのタイムスタンプです。

例えば:

/ajax_helper.php?ts=3211321456

次に、渡す必要があるすべてのキャッシュマネージャーは、キャッシュリポジトリで同じURLを見つけず、ページコンテンツを再ダウンロードしました。


古い答えですが、私の2セント:これは一般に良いアドバイスであり、有能なほとんどのWeb開発者に理解されていますが、jQueryの特定のケースでは、を作成し$.ajaxてオプションを設定すると{cache:false}、jQuery自体が自動的にキャッシュ無効化を追加します何もすることなく、舞台裏で。
JakeGould

0

アプリによっては、iOS 6でSafari> Advanced> Web Inspectorを使用して問題をトラブルシューティングできるため、この状況に役立ちます。

電話をMacのSafariに接続し、開発者メニューを使用してWebアプリのトラブルシューティングを行います。

iOS6にアップデートした後、Webビューを使用するアプリに固有のiPhone上のWebサイトデータを消去します。1つのアプリのみに問題があり、これによりIOS6ベータテスト中に問題が解決しました。

アプリも確認する必要がある場合があります。カスタムアプリのWebViewにある場合は、NSURLCacheを確認してください。

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003754

あなたの問題の本質、実装などに依存すると思います。

参照:$ .ajax呼び出し


これは元の質問に直接対処するものではありませんが、一般的にデバイス上の問題をトラブルシューティングできる非常に役立つ情報なので、私はそれを賛成票で投票しています。
Kris Giesing、2012年

0

なぜ機能するのか気になる1つの回避策を見つけました。ASP.NET Webサービスに関するTadejの回答を読む前に、私は機能するものを考え出そうとしていました。

そして、それが良い解決策であると言っているわけではありませんが、私はそれをここに文書化したかっただけです。

メインページ:JavaScript関数checkStatus()が含まれています。このメソッドは、jQuery AJAX呼び出しを使用してHTMLコンテンツを更新する別のメソッドを呼び出します。setIntervalを使用してcheckStatus()を呼び出しました。もちろん、私はキャッシュの問題に出くわしました。

解決策:別のページを使用して更新を呼び出します。

メインページで、ブール変数runUpdateを設定し、bodyタグに以下を追加しました。

<iframe src="helper.html" style="display: none; visibility: hidden;"></iframe>

helper.htmlの:

<meta http-equiv="refresh" content="5">
<script type="text/javascript">
    if (parent.runUpdate) { parent.checkStatus(); }
</script>

したがって、メインページからcheckStatus()を呼び出すと、キャッシュされたコンテンツが取得されます。子ページからcheckStatusを呼び出すと、更新されたコンテンツを取得します。


0

ログインページとサインアップページはFirefox、IE、Chromeの魅力のように機能しますが、SafariのIOSおよびOSXでこの問題に悩んでいますが、数か月前にSOの回避策を見つけました。

<body onunload="">

またはJavaScript経由

<script type="text/javascript">
window.onunload = function(e){
    e.preventDefault();
    return;
};
</script>   

これはちょっと醜いことですが、しばらくは機能します。

理由はわかりませんが、onunloadイベントにnullを返すと、ページがSafariにキャッシュされません。


0

iOSバージョン9および10を実行している古いiPhoneおよびiPadでは、おそらくAppleのCPU速度が低下しているために、時々、偽の空のAJAX結果が返されることがわかりました。空白の結果を返すとき、iOSはキャッシュから結果を返すようにサーバーを呼び出しません。頻度は大きく異なり、AJAX呼び出しの約10%から30%は空白を返します。

解決策は信じがたいです。1秒間待ってからもう一度呼び出します。テストでは、必要なのは1回の繰り返しだけでしたが、最大4回呼び出すコードを記述しました。1秒の待機が必要かどうかはわかりませんが、繰り返しの呼び出しのバーストによってサーバーに負荷がかかるリスクを冒したくありませんでした。

この問題は、2つの異なるAJAX呼び出しで発生し、異なるデータを使用して異なるAPIファイルを呼び出すことがわかりました。しかし、どのAJAX呼び出しでも発生する可能性があると心配しています。すべてのAJAX結果を検査するわけではなく、古いデバイスですべての呼び出しを複数回テストするわけではないため、わかりません。

両方のAJAX呼び出しで使用されていた問題:POST、Asynchronously = true、setRequestHeader =( 'Content-Type'、 'application / x-www-form-urlencoded')

問題が発生すると、通常は1つのAJAX呼び出しのみが行われます。したがって、AJAX呼び出しの重複が原因ではありません。デバイスがビジー状態のときに問題が発生することもありますが、そうでない場合もあり、DevToolsがないと、その時点で何が起こっているのか本当にわかりません。

iOS 13はこれを実行せず、ChromeまたはFirefoxも実行しません。iOS 11または12を実行しているテストデバイスはありません。おそらく他の誰かがテストできますか?

この質問は、この問題を検索したときのGoogleの上位の結果であるため、ここでこれに注目します。


-1

それはで働いASP.NETのみ追加した後pragma:no-cacheに、ヘッダーをIISCache-Control: no-cache十分ではなかった


-2

関数のシグネチャを次のように変更するための回避策を提案します。

getNewRecordID(intRecordType、strTimestamp)そしてTimeStampパラメータも常に渡し、サーバー側でその値を破棄します。これは問題を回避します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.