我们的应用程序部署到物理设备,因此起始页面index.html位于设备的存储中,并且该文件将引用远程托管的JavaScript文件和其他资源。也就是说,index.html 本身并不托管在我们的网络服务器中。在这种情况下是否可以使用html5应用程序缓存?也就是说,html 元素将如下所示:
<html manifest="http://remotehost.com/site.manifest">
支持吗?或者如果我们的网络服务器没有托管index.html,是否有解决方法可以使其工作?
谢谢!
最佳答案
检查此网站的基本要求和限制: http://appcachefacts.info/
当您的文件部署到设备存储时,有一些因素会阻止应用程序缓存工作:
-
Cross-Origin-Policy
:您正在引用来自其他来源的 list 文件 -> 不允许 -
WebKit
:我假设您的 WebView 渲染 index.html 是由 WebKit 驱动的(iOs/Android)。我在台式电脑上使用 Safari 和 Chrome 进行了一些测试,发现如果 index.html 是从http://localhost
提供的,则 list 会被忽略。或file://...
即使 list 遵循跨源策略,URL 也是如此。这会对您造成打击,因为您设备上本地部署的 index.html 将由file://...
提供服务。在大多数情况下。
所以我想出了将 list 下载到设备并在我的index.html 中引用它的想法。这导致了一些我无法修复的额外问题(我的设置是 PhoneGap、jQueryMobile、iOS):
-
Mime-Type
:您无法确保 list (从设备的存储中提供)具有正确的 mime 类型 header ,但如果没有它们,浏览器将忽略 list 。 -
Manifest-URI
:您无法(硬编码)使用预定义的manifest="uri/to/appCacheManifest.manifest"
分发index.html文件。属性(因为在知道这个 uri 之前,您需要从服务器下载并保存它)。此外,您无法操作随 PhoneGap 应用程序(www 文件夹)分发的资源以某种方式更改属性。
到目前为止,我无法让 list 在 PhoneGap WebView 中工作。我读过一些文章,其中人们提到(iOS)WebView 无法使用 list 文件,但这是不正确的。如果您通过移动浏览器导航到 Web 应用程序并在主屏幕上保存书签,iOS 会将此站点嵌入到 WebView 中。我在我的应用程序中尝试了这一点(由网络服务器提供;未嵌入 PhoneGap),并且 list 工作得很好。
这意味着,如果您能够将“位于设备存储中”的文件移动到网络服务器,并且设置 native WebView 来指向该位置,则 list 应该可以正常工作。
关于html5 应用程序缓存 : does remote manifest file work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7030170/