3

HTML5 AppCache を使用して、オフラインで機能する Android Web アプリを作成しています。追加の画像、スタイルシート、javascript、および iframe をソースとする HTML は、loadDataWithBaseURL() を使用して WebView にロードされます。残念ながら、デバイスがオフラインの場合、iframe でソース化された HTML のみが AppCache から読み込まれます。

この時点で、私は知っています:

  • AppCache.db ファイルのコンテンツを adb シェルでダンプし、そこにすべてのコンテンツが見つかったため、このコンテンツは AppCache に存在します。
  • loadDataWithBaseURL() の baseUrl フィールドに正しいパスを指定しているので、おそらくドメインの問題ではありません。また、以下で説明するように、この問題の回避策はドメイン エラーなしで成功します。

ここにいくつかのデモコードがあります:

public class ExampleActivity extends Activity {

   ...

  // HTML to be inserted into the Webview with loadDataWithBaseURL()
  public static final String ALL_HTML = 
      "<!DOCTYPE HTML><html>" +
      "<head><script src='sourced_js.js' " +
         "onload='console.log(\"sourced_js.js onload\");'>" +
      "</script>" +
      "<link rel='stylesheet' href='style.css' />" +   // doesn't load offline
      "</head><body>" +
      "<iframe src='manifest.html'></iframe>" +        // loads
      "<img src='android.jpg' />" +                    // doesn't load
      "<img src='android.gif' />" +                    // doesn't load
      "</body></html>";

  public void onCreate(Bundle savedInstanceState) {

    ...

    WebView webView = new WebView(context);
    webView.clearCache(true);

    WebSettings settings = webView.getSettings();
    settings.setAppCacheEnabled(true);
    settings.setJavaScriptEnabled(true);

    webView.loadDataWithBaseURL("http://my.website.com/path/to/content/",
        ALL_HTML, "text/html", "utf-8", null);
  }
}

manifest.htmlマニフェストを参照するだけです。次のようになります。

<html manifest="manifest.appcache">
<head></head>
<body></body>
</html>

manifest.appcache次のようになります。

CACHE MANIFEST

# Explicitly cached resources
# manifest.html automatically cached
sourced_js.js
android.jpg
android.gif
style.css

NETWORK:
*

オンラインの場合、すべてのコンテンツが読み込まれます。オフラインの場合、iframe のみがmanifest.html読み込まれます。画像、スタイルシート、JavaScript が読み込まれていません。

不思議なことに、まったく同じ静的コンテンツ ( sourced_js.jsandroid.jpg、...)をソースにmanifest.htmlすると、デバイスがオフラインのときに iframe の AppCache からすべて正しく読み込まれます! これらの他のリソースは、静的ページから二次的に調達する必要があるかのように。

このコンテンツが AppCache からロードされない理由の手がかりはありますか?

4

1 に答える 1

1

仕様によると、Web サーバーの *.appcache ファイルに対して正しい MIME タイプの応答設定 (text/cache-manifest) を設定しないと、appcache は機能しません。

デスクトップ ブラウザ、モバイル ブラウザ、iOS UIWebView でも同じ動作が期待されます。

于 2012-08-03T20:37:25.253 に答える