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.jsandroid.jpg,...),他们从应用程序缓存所有负载在iframe当正确的设备离线!就好像这些其他资源必须从静态页面进行二次采购。

任何线索为什么这个内容不会从AppCache中加载?

根据规格,如果您未在Web服务器中为* .appcache文件设置正确的MIME类型响应设置(文本/缓存清单),则该appcache将不起作用。

在桌面浏览器,移动浏览器和iOS UIWebView中预期的行为相同。