21

オフラインで使用する Web アプリを開発しているため、アプリケーション キャッシュ機能を使用する必要があります。

Chrome (15.0.874.106) ではすべて正常に動作しますが、Firefox (7.0.1) と Opera (11.52) では動作しません。

これは私のキャッシュ マニフェスト ファイルですcache.manifest.php(最小限に減らしました)。

<?php 
    header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
    header('Content-type: text/cache-manifest');
?>CACHE MANIFEST

CACHE:

/app/common/css/reset.css
/favicon.ico

そして、これは「メイン」HTML ドキュメントの最初の 4 行です。

<!DOCTYPE html> 
<html manifest="/app/mobile/cache.manifest.php"> 
    <head> 
    <title>MyApp Mobile</title> 

キャッシュ マニフェスト (http://www.myapp.com/app/mobile/cache.manifest.php) をブラウザーに読み込もうとすると、ファイルは正しく表示されますが、一度オフラインでページを読み込もうとすると、 「接続できません」エラー ページ。繰り返しますが、これは Firefox と Opera でのみ発生します。

Firebug は " 0 items in offline cache" と表示し、DragonFly のアプリケーション キャッシュをチェックする方法が見つかりませんでした。

Firefox と Opera で問題を効果的にデバッグする方法がわかりません。助けてください。

ありがとう、ダン

4

13 に答える 13

15

HTML5 AppCacheを使用した私の経験では、一度機能させると素晴らしいですが、非常に脆弱です。それで最も小さな問題がある場合、ブラウザはファイル全体を無視し、迷惑なことに、ブラウザの通常のキャッシュを使用するのではなく、サーバーからすべてを最初から再ロードします。

さらに悪いことに、テキストコンテンツが変更されない限り、ブラウザはマニフェストファイルを再ロードしません。したがって、サーバーヘッダーなどを微調整して修正することもできますが、変更の内容が変更されない限り、ブラウザーはやみくもにそれを無視し、前回とまったく同じように実行します。壊れている可能性がありますが、修正しましたが、のテキストコンテンツが変更されていないため、ブラウザは変更を無視しています。これは、ブラウザのキャッシュをクリアすることにも影響されないようです。これは、ブラウザのキャッシュを非常に混乱させる原因の1つです。アプリのキャッシュは、キャッシュに関して非常に深刻です。cache.manifest.php cache.manifest.php

これを回避するには、コメントのテキストの変更が重要になるため、バージョン、タイムスタンプ、または日付(例# Version 1.2)を含むコメントを上部に配置し、ブラウザに「通知」させたいときに変更します。

そうすると、ブラウザはまだすぐには使用しません!アプリのキャッシュが機能する方法は、次にページを読み込んだときに、前回とまったく同じように実行され、バックグラウンドで更新の確認を開始することです。したがって、おそらくコンソールを起動し、「更新中...」、「完了」のようなものを待ってから、 [更新]をクリックすると、ブラウザは最終的に新しいバージョンの使用を開始します。やっと!

全体として、仕事を始めるのは正しい苦痛かもしれません。ただし、動作するとほぼ防弾になります。ファイルのテキストコンテンツを変更するまで、キャッシュマニフェストにリストされているものはすべて、ユーザーごとにだけダウンロードされるので安心できます。

最近のブラウザ標準への準拠はかなり良いので、実際に動作していると思いますが、最後にChromeをチェックし、マニフェストファイルを正しくキャッシュした唯一のブラウザです。開発中に壊れた可能性がありますが、FirefoxとOperaは古いマニフェストファイルを手に入れて死にかけています。FirefoxとOperaでブラウザのキャッシュをクリアしようとしましたが、おそらく何もしませんでした。FirefoxとOperaのいずれかが最終的に壊れたバージョンのマニフェストファイルを放棄する前に、ファイルのテキストコンテンツを変更し、再更新する必要があります。おそらく何年も前にアップロードしたものを使い始めてください。

于 2011-12-04T15:16:27.157 に答える
9

から: http://appcache.offline.technology

Firefox では、マニフェストに明示的に含まれていても、Cache-control: no-store で提供されるリソースはキャッシュされません。

私のphpはデフォルトで送信しています:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

追加するだけで十分です:

header("Cache-Control: no-cache, must-revalidate");

キャッシュを開始するには、php ファイルに移動します。

(これは Mychal Hackman の回答に似ていますが、もう少し具体的です)。

于 2013-01-23T01:59:15.027 に答える
3

私には、キャッシュマニフェストは少し「珍しい」ように見えます...セクションを追加すると役立つ場合がありますFALLBACK...別のポイントは、appcacheが「通常のブラウザキャッシュ」に干渉する可能性があることです。つまり、キャッシュマニフェストが変更された場合は作成する必要がありますブラウザがそれをリロードすることを確認してください。理想的には、これは名前を変更することによって実現されます(たとえば、名前の一部としてバージョン番号、タイムスタンプ...を使用することによって)。

JSを介してページ内でappcacheを操作できます。これは、発生した問題を特定するのに役立ちます。

JSコードや詳細なウォークスルーなどの詳細については、を参照してください。

必要に応じて、具体的な質問をして戻ってきてください。

アップデート

OPによって提供されたコメントによると、これは、上記のリンクで説明されているように、appcacheをチェック/デバッグするためのJSAPIの優れた実装を示しています。

于 2011-12-04T06:58:41.747 に答える
3

を使用して、アプリケーション キャッシュの現在のステータスを確認できます。これは、次の状態にwindow.applicationCache.statusマップされた数値を返し ます。0 - uncached1 - idle2 - checking3 - downloading4 - updateready5 - obsolete.

アプリケーション キャッシュ API には、注目すべき点がいくつかあります。 window.applicationCache.update(): これにより、アプリケーション キャッシュのダウンロード プロセスがトリガーされます。これは、ページのリロードとほぼ同じです。マニフェストが変更されているかどうかを確認し、変更されている場合は、キャッシュ内のすべてのコンテンツの新しいバージョンをダウンロードします (キャッシュ ヘッダーを尊重します)。これで新しいキャッシュが作成されても、ページは引き続き古いキャッシュを使用することに注意してください。ダウンロードしたばかりの新しいキャッシュをページで使用するには、swapCache()関数を使用する必要があります。

window.applicationCache.swapCache(): この関数は、新しいキャッシュ データが利用可能であれば、それを使用して開始するようにブラウザに指示します。新しいマニフェスト ファイルが存在する場合でも、アプリケーションswapCache()は呼び出されるまで古いキャッシュ (古いマニフェスト ファイルで指定されている) を使用し続けることに注意することが重要です。swapCache()が呼び出されると、キャッシュは新しいマニフェスト ファイルから指定されたとおりに使用されます。

から: http://dev.opera.com/articles/view/offline-applications-html5-appcache/

于 2011-12-05T17:52:43.363 に答える
3

でキャッシュを確認してくださいabout:cache。PHPファイルに「データサイズ0バイト」が表示されるに違いありません。

キャッシュ ヘッダーを確認してください。Firefox では、php ファイルのデフォルトが「no-cache」であることがわかりました。私はちょうど追加しました:

header("Pragma: public");
header("Cache-Control: public, max-age=6000");

私のPHPファイルに追加し、オフラインキャッシュをリロードしたところ、最終的に機能しています。

HTH

于 2011-12-09T17:16:03.467 に答える
2

Firefox の場合は、次の小さなトリックを試してください。

<html manifest="/app/mobile/cache.manifest.php?1"> 

最終的に Firefox に最新のファイルをチェックさせる "?1" です。とにかく、それが私にとってのトリックでした。お役に立てれば。

于 2014-05-21T03:22:47.773 に答える
2

削除してみてください:

header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");

Content-type ヘッダーのみを送信するようにします。

<?php header('Content-type: text/cache-manifest'); ?>

ApplicationCache はキャッシュを強制します (単純化しすぎていますが、それほどではありません)。これらの最初の 3 つのヘッダーは、キャッシュを防止する方法です。

これらのヘッダーが存在する場合、Opera はキャッシュを防止するようです。Firefox のデバッグ ツールは、AppCache のデバッグに関しては少し不安定ですが、これで修正されると想定しても問題はありません。

于 2011-12-05T22:51:34.407 に答える
1

iPad でサイトをオフラインで動作させた私の経験から:

  • ファイルの名前はで終わる必要があります.manifest
  • MIME タイプはtext/cache-manifest
  • マニフェストのコメントにバージョンを含める
  • window.applicationCache...ブラウザがマニフェストの変更を確認し、コンテンツをリロードするかどうかを確認し、ステータス イベントをキャプチャしてどこかに表示するために使用するいくつかの JavaScript 関数を作成します。

参照: http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/OfflineApplicationCache/OfflineApplicationCache.html#//apple_ref/doc/uid/TP40007256-CH7-SW1

于 2011-12-09T20:55:19.117 に答える
1

同様の問題がありました。回答が非常に遅れていますが、これは他の人にとって役立つかもしれません。AshleysBrian の回答で説明されている問題に遭遇しないようにしてください。それに加えて

  1. マニフェスト ファイルが「text/cache-manifest」タイプとして提供されていることを確認します
  2. Firefox/IE のプライベート ブラウジング モードで試してはいけません。通常の閲覧モードでのみ機能します。ただし、Chrome では両方のモードで動作します
  3. オフライン中に URL を変更するだけで問題が発生する可能性があります

    Eg: http://localhost:8080/app doesn't work on Firefox/IE
    but http://localhost:8080/app/ works in Firefox/IE 
    

    どちらもChromeで動作します

  4. これらの便利なリソース ビューアを使用して、より詳細な視点を得る

    about:cache - Firefox
    chrome://appcache-internals/ - Chrome
    Pls fill in if someone knows what is it for IE
    
于 2014-04-09T16:26:30.347 に答える
0

私が理解しているように、W3CHTML5ドラフトのオフラインWebアプリケーションのセクションは非規範的です。つまり、まだ正式なHTML5標準の一部ではありません。

この機能はまだHTML5標準の一部ではないため、ブラウザが異なると、実装を選択したとしても、実装が異なり、さまざまな/非標準になる可能性があります。すべてのブラウザがそれをサポートすることを選択できるわけではありません。標準の一部になるまで、非規範的な機能に依存しないでください。

于 2011-12-04T07:48:19.553 に答える
0

似たようなものを見つけて、マニフェストの Cache-Control: no-store 見出しまで追跡しました。Chrome はこれを受け入れますが、Firefox はこれで黙って失敗します。

私のテストでは、キャッシュなしのヘッダーと期限切れのヘッダーを保持して、頻繁に更新できることが示されました。

于 2014-09-30T10:40:47.003 に答える