Webview AppCache未加载源非HTML内容
问题描述:
我正在使用HTML5 AppCache创建可以脱机工作的Android Web应用程序。使用loadDataWithBaseURL()将附加图像,样式表,JavaScript和iframe源代码的HTML加载到WebView中。不幸的是,当设备处于离线状态时,仅从AppCache中加载源自iframe的HTML。Webview AppCache未加载源非HTML内容
在这一点上,我知道:
- 这项内容在应用程序缓存的存在,因为我甩了AppCache.db与亚行shell文件的内容和发现所有的内容在那里。
- 这可能不是一个域问题,因为我在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:
*
在线时,所有的内容加载。脱机时,只加载加载了manifest.html
的iframe。图像,样式表和JavaScript未加载。
奇怪的是,如果我在manifest.html
源完全相同的静态内容(sourced_js.js
,android.jpg
,...),他们从应用程序缓存所有负载在iframe当正确的设备离线!就好像这些其他资源必须从静态页面进行二次采购。
任何线索为什么这个内容不会从AppCache中加载?
答
根据规格,如果您未在Web服务器中为* .appcache文件设置正确的MIME类型响应设置(文本/缓存清单),则该appcache将不起作用。
在桌面浏览器,移动浏览器和iOS UIWebView中预期的行为相同。