cache.manifest / 离线使用网络应用程序的奇怪行为保存到 ipad ios6 上的主屏幕

Posted

技术标签:

【中文标题】cache.manifest / 离线使用网络应用程序的奇怪行为保存到 ipad ios6 上的主屏幕【英文标题】:strange behaviour with cache.manifest / offline usage of web app saved to home-screen on ipad ios6 【发布时间】:2012-09-27 15:51:48 【问题描述】:

我刚刚发现新 ios 6 在 iPad 上出现了一些奇怪的行为。我正在测试一个网络应用程序以供离线使用。 Web 应用程序只不过是一个带有缓存清单的静态网站,因此没有使用像 sencha touch 这样的特殊框架或像 phnoegap 这样的工具。只是 html、CSS 和 javascript 以及一个 cache.manifest。

该应用程序之前运行良好:我可以将网站保存到主屏幕。当我从那里打开它时,所有数据都将被下载以进行缓存。在下载结束时,弹出窗口会询问我是否要将缓存增加到 50MB - 接受 - 一切都很好 - 离线使用有效。

现在更新到 iOS 6 后: 我对应用程序进行了一些更改。从主屏幕卸载应用程序。在移动 Safari 中再次打开它。保存到主屏幕。当打开下载按预期开始。但随后它冻结在 99%。当我在控制台中查找它时,我收到错误消息: “应用程序缓存更新失败,因为超出了大小配额。”

奇怪的事情来了:当我在浏览器中打开它时,下载开始,最后我被问到是否要将缓存大小增加到 50MB。我当然确认。当我现在在“网站数据”中查看 safari 的首选项时,我看到这个应用程序的所有缓存数据大约是 33MB!所以根本不超过50MB!

这是iOS6的bug吗?自 iOS 6 更新以来,在将网站保存到主屏幕时,是否有人遇到过缓存数据问题?感谢您的帮助,因为我真的被困在这里......在网络上找不到任何有用的东西......

(很遗憾,我无法发布任何指向网络应用程序和/或其文件的链接)。

编辑:

我找到了有关此问题的更多信息:

http://www.nsbasic.com/blog/?p=928

显然,保存到主屏幕的 wep 应用现在被视为原生应用,这意味着保存到主屏幕的同一网络应用的每个实例都有自己的“存储沙盒”。因此数据独立于移动 Safari 中保存的数据。这意味着如果您删除所有移动 safari 的网站数据,这对保存到主屏幕的网络应用程序没有影响(在 ios6 之前,它们共享相同的数据)。

我还发现了这个:

iOS 6 breaks GeoLocation in webapps (apple-mobile-web-app-capable)

虽然不是完全相同的主题,但可能是相关的。显然网络应用程序使用

保存到主屏幕
<meta content="yes" name="apple-mobile-web-app-capable" />

将无法使用地理位置。仅当您从 Web 应用程序中删除此元标记时,地理位置才有效。也许这也是缓存问题的解决方法,我还不能测试它。但话又说回来:如果将保存到主屏幕的 Web 应用程序更像原生应用程序处理,也许不再需要 cache.manifest?如果我发现更多,我会在这里报告。

EDIT2:

好的,经过一些测试,无论是网络还是苹果都没有有用的提示,我至少发现了一些东西:当我删除

<meta content="yes" name="apple-mobile-web-app-capable" />

从该站点来看,一切正常,因为就像您打开 Safari 一样,到目前为止我没有遇到任何问题。所以我的兴趣是让它在没有浏览器 chrome 的情况下工作。如上所述,缓存仅达到 99%,然后我得到缓存大小配额超出错误。然后我只是关闭了主屏幕应用程序并再次打开它。现在缓存下载重新开始,完成就好了!没有冻结,没有错误!一切似乎都存储在本地。我今天只能在 iPad 模拟器上测试它,但我希望我能在稍后拿到我们的设备后尽快确认这一点。

所以看起来不是被问到是否要增加缓存大小,而是得到缓存大小配额超出错误。也许是因为现在主屏幕应用程序的数据存储处理方式不同,您不必再手动增加缓存大小(这当然是纯粹的猜测)。不过,如果是这样的话,应该不会有任何错误。因此,您不必被要求增加缓存大小,而是必须打开主屏幕应用程序两次,顺便说一句,这是一个相当蹩脚的解决方法......

EDIT3:

我只能在真实设备上确认此行为:保存到主屏幕 -> 从主屏幕打开 -> 下载到缓存文件 -> 最后缓存大小配额超出错误 -> 关闭主屏幕应用程序(按主页按钮)->再次重新打开->再次下载缓存文件->这次没有错误->一切都可以离线使用。

我还在一台装有 iOS 5 的设备上对其进行了测试,它可以正常工作,没有错误。所以这绝对是 iOS 6 的问题。

其他人可以确认此行为或错误吗?

EDIT4:

我偶尔有机会在 iOS 6.1.3 上对此进行测试 - 不幸的是仍然是相同的行为...

【问题讨论】:

我无法确认该错误,因为它按预期工作,但我可以解释 50MB 的限制。 Safari 有限制。 iOS 5 上的默认值是 10MB,然后下一个是 25MB,下一个是 50MB。因此,如果您的应用程序小于 10 MB,则无需提出任何问题。如果它是 15 MB,则要求将限制增加到下一级(25MB),因此如果是 33,则下一级是 50 MB,因此直接要求您提供此 50MB 限制。在 iOS 6 上,我在某处读到现在第一级是 25MB。 【参考方案1】:

我发现以下链接很有帮助。它解释说,由于主屏幕应用现在像原生应用一样存储,它们有自己的存储/缓存。

地理位置在第一次迭代时有效,但此后无法更新。

iOS 6 Geolocation and Local Data Storage

“现在,主屏幕应用程序中的数据像原生应用程序一样存储。每个原生应用程序都有自己的沙箱,用于存储、备份和恢复数据。在 iOS 6 之前,主屏幕应用程序与运行的同一个应用程序共享数据在浏览器中。如果用户清除浏览器中的缓存,应用程序的主屏幕版本也会丢失其数据。在 iOS 6 中,主屏幕应用程序的数据会像原生应用程序一样保存到沙箱中。备份和恢复处理数据正常,清除浏览器缓存不会影响数据。”

【讨论】:

是的,我也得到了这些信息(请参阅我在问题中发布的链接)。但它没有解释为什么 cache.manifest 不能像 ios5 上的主屏幕应用程序那样工作,或者 ios6 上的主屏幕应用程序是否需要 cache.manifest,如果不需要,主屏幕应用程序的数据是如何存储的现在在ios6上。这就是我现在卡住的地方。因为如果主屏幕应用程序将其数据保存到自己的沙箱中,我希望它们不再有大小限制......你所说的“发现有用”是什么意思?你有解决这个问题的办法吗? 你能在 iOS 6.1 beta 上测试这个吗?似乎 Apple 解决了 cache.manifest 的一些问题。

以上是关于cache.manifest / 离线使用网络应用程序的奇怪行为保存到 ipad ios6 上的主屏幕的主要内容,如果未能解决你的问题,请参考以下文章

离线访问-manifest(有疑问未解决)

h5离线存储manifest

h5离线存储manifest

h5笔记2

application cache

加载缓存清单文件