web-dev-qa-db-ja.com

モバイルWebアプリがキャッシュを適切にクリアしない

IPad用のモバイルWebアプリを開発していて、コードのテスト中に問題が発生しました。

たまに、そしてランダムに見えるように、iPadは私が書いたすべてのJSライブラリの更新を適切に停止します。一部のコードを更新して変更をポストした後、一部のファイルは適切に更新され、他のファイルは更新されないことに気づきます。この動作は、多数のキャッシュのクリア、電源の再投入、およびwifiの切り​​替え後も持続します。

Safariでアプリをロードしても問題はありませんが、アプリのホーム画面アイコンからロードすると、問題が再び発生します。ライブラリにアラート行を追加するなどの簡単なテストを行ったところ、モバイルWebアプリウィンドウ内を除いて、問題なくアラートが発生しました。その後、再びランダムに見えるようになり、問題が解消されます。5分かかる場合もあれば、1時間かかる場合もあります。

アプリがマニフェストファイルを使用しているかどうかに関係なく、この動作が見られます。また、マニフェストファイルを更新して再キャッシュを強制することにより、これらのレガシーファイルをフラッシュしようとしましたが、問題は解決しません。

これがiPadの既知の問題であるかどうか誰かが知っていますか?これに対処するためにできることが何かありますか?

34
Mulberry

私にとって、解決策は?v=1すべてのJavaScriptおよびCSSリンクの最後に。私はそれを別のStackoverflowポストで見る前にすべてを試しました、そしてそれは直接働きました!!!そろそろ...

11
Ludovic

私は解決策を得ました!

しかし、最初の問題は、iPadとiPhoneがアプリを開いたときにキャッシュを更新しないことです。アプリの削除、Safariキャッシュのクリア、デバイスの再起動なども機能しません。

そして、これが解決策です... taadaa!

マニフェストファイルを変更する必要があります。変更すると、iPad/iPhoneがキャッシュをリロードします。したがって、マニフェストファイルにバージョン番号を記述し、何かを変更したときにそれを変更します。

# Version: 1.2

したがって、完全なマニフェストファイルは次のようになります。

CACHE MANIFEST

# Version 1.5

NETWORK:
*

CACHE:
index.html
jquery-1.7.2.min.js
images/logo.jpg

マニフェストファイルに書き込まれていない画像なども再読み込みします。私はそれを数回テストしました。

ところで http://manifest-validator.com でマニフェストファイルを確認することを忘れないでください

私のソースは、オフラインのWebアプリケーションについてこの非常にクールな方法です: http://gregsramblings.com/2012/05/28/html5-application-cache-how-to/

また、アプリを2回起動する必要があるかもしれません:

マニフェストが更新された場合、ブラウザはキャッシュファイルリスト内のすべてのファイルをダウンロードしますが、元のコンテンツはこの時点ですでに読み込まれています(既にキャッシュされているため、超高速で読み込まれます!)。

しかし、それは常に最初の試みで私のために働きました。

8
bench-o

この問題を回避してください。次のようにWebアプリケーション自体へのリンクを追加します...

<a href="javascript:top.frames.location.reload();">refresh</a>

これは、iPhone/iPad Safariアドレスバーのリロードボタンと同じように機能します。

6
John Wolf

私はこの問題を修正するために数時間費やしましたが、ファイルキャッシュを管理することになっているマニフェストファイル自体をキャッシュすることができ、Webアプリをどんどん残したままのようです。

私の場合、何もキャッシュしたくありませんでした。これが私が問題を解決した方法です:

  • サーバーでmod_expires Apacheモジュールを有効にする
  • インデックスファイルと同じディレクトリに.htaccessファイルを作成します。ファイルには、ExpiresDefault A1という行が含まれている必要があります。

これは、すべてのファイルがアクセスされてから1秒後に期限切れになることをサーバーに伝えます。私のWebアプリは、学生大会でのアンケートとして使用されているため、一度に1人しか使用していません。私の解決策は私にとってうまくいきます。自分に合うようにさらに微調整する必要があるかもしれません。

以前は、この問題は一見ランダムに現れていました。私の最近のすべてのテストでは、期待どおりに応答することが示されています。

2
Jezen Thomas

キャッシュが適切にクリアされていることを確認できませんが、これでうまくいきました。

これを行うには、iOSデバイスでWeb Inspectorを許可する必要があります。 [設定]> [Safari]> [詳細設定]> [Webインスペクター]に移動します(アクティブにする必要があります)そして、コンピューターのSafariで開発者メニューをアクティブにする必要があります。 [設定]> [詳細設定]> [開発者をアクティブ化]メニューに移動します

  1. デバイスをUSBケーブルでコンピューターに接続します
  2. Safari> Developpement> Your device name> Inspect an App(app is running)に移動します
  3. これにより、Webアプリ用にコンピューター上のインスペクターが開きます
  4. インスペクターが開いている間、キャッシュをクリアします(コマンド+ alt + E)
  5. インスペクターを開いたまま、コンピューターのページを更新します(コマンド+ R)

どういうわけか、Webアプリのキャッシュがクリアされ、キャッシュされていないコードが表示されました。

2
onemesh

iPadをオフにしてからオンにすることは私にとっては機能します-少なくともiOS 5では完全にオフではありません。iPadの上部にあるスリープボタンを使用し、ホームボタンを使用してオンに戻します。ファイルの最後にバージョン番号を追加することもできますが、かなり面倒です。

1
Summer

IPadのWebアプリケーションでまったく同じ問題が発生します-時々、ランダムに、スタンドアロンモードで実行されているWebアプリが特定のリソース(HTML/CSS/JSファイル)を更新しないことがあります。 Safariのキャッシュと履歴、再起動、wifi接続の再起動、manifestファイルの更新または削除、またはデバイスを電子レンジに入れます。ハンマーを当てても無駄であることがわかった。

私はそれを修正するための「コーシャ」方法を見つけていませんが、回避策は常にあります-renameリソース。

更新しないファイルの名前を変更するだけです。 foobar.jsが更新されないなどの問題がある場合は、名前をfoobar2.jsに変更し、他のファイルのこのリソースにreferencesを更新します。もちろん、これはあなたが何を知っているのかの痛み(特に1週間の開発の後にfoobar12.jsにいるとき)まで、私たちは、iOSの公式の修正または有効な更新技術を見ています。それが、私がそれを起動して実行するために知っている唯一の方法です。

1
Neo

この問題を解決するには、新しいletters with numbers ((numbers)ではない)をリンクの最後に追加する必要があります。

?v1
?x2
?z3

また、スクリプトを更新するたびに、異なる文字と数字を追加する必要があります(現在、多くのモバイルブラウザはJavaScript/CSSリンクの末尾にある純粋な数字をすべて無視しているため、異なる文字が必要です)。

0

私は何日もかけてこの問題に取り組みました。 CSSとHTMLの両方で偶然変更を加えたため、レンダリングのバグのように見え、ボタンを画面上のランダムな場所に配置すると、アプリが使用できなくなりました。

私はCSSがキャッシュされていて、数日間突っ込んで突っ込んだ後、最終的にファイルの名前を変更しようとしたと@Neoが話しました。また、ブラウザに1年間キャッシュするように指示する古い.htaccessを使用していたため、.htaccessファイルのキャッシュ制御も変更しました。

tl; dr:webappファイルのcache-control( mod_expires および mod_headers )を削除し、そうでない場合は cache manifest を使用します既に。次に、ファイルの名前を変更し、HTMLのリンクを更新すれば、問題ないはずです。

0
skeggse

私はまったく同じ問題を抱えていました。

ここでさまざまな提案を試し、キャッシュコントロールを追加しました。更新を拒否したファイルの名前を変更してみましたが、うまくいきませんでした。キャッシュマニフェストを追加しようとしました(以前はありましたが、削除しました)。そして、私はいつものことをすべて試しました:アプリの削除、キャッシュのクリア、再起動、アプリの再インストール、運がありません。

私にとってうまくいった唯一のことは、私のWebサーバー上の仮想ディレクトリの名前を変更することでした。ローカルのIISサーバーを使用してテストしているので、幸いにも、これは実際には問題ではありませんでした。

0
René