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.js
、android.jpg
、...)をソースにmanifest.html
すると、デバイスがオフラインのときに iframe の AppCache からすべて正しく読み込まれます! これらの他のリソースは、静的ページから二次的に調達する必要があるかのように。
このコンテンツが AppCache からロードされない理由の手がかりはありますか?