我刚刚在装有新 iOS 6 的 iPad 上发现了一些奇怪的行为。我正在测试一个用于离线使用的网络应用程序。 Web 应用程序只不过是一个带有缓存清单的静态网站,因此没有使用像 sencha touch 这样的特殊框架或像 phnoegap 这样的工具。只需 HTML、CSS 和 JavaScript 以及一个 cache.manifest。
该应用程序以前运行良好:我可以将网站保存到主屏幕。当我从那里打开它时,所有数据都会被下载以进行缓存。下载结束时,弹出窗口会询问我是否要将缓存增加到 50MB – 接受 – 一切都很好 – 离线使用有效。
现在更新到 iOS 6 后:
我对应用程序做了一些更改。从主屏幕卸载该应用程序。在 mobile safari 中再次打开它。保存到主屏幕。打开后,下载就会按预期开始。但随后它就冻结在 99% 了。当我在控制台中查找它时,我收到错误消息:
“应用程序缓存更新失败,因为超出了大小配额。”
奇怪的事情来了:当我在浏览器中打开它时,下载开始,最后我被问到是否要将缓存大小增加到 50MB。我当然确认。当我现在查看 safari 首选项中的“网站数据”时,我发现该应用程序的所有缓存数据约为 33MB!所以根本不超过50MB!
这是iOS6的bug吗?自从更新到 iOS 6 以来,有人在将网站保存到主屏幕时遇到过缓存数据的问题吗?谢谢您的帮助,因为我真的被困在这里......在网络上找不到任何有用的东西......
(不幸的是,我无法发布任何指向网络应用程序和/或其文件的链接)。
EDIT:
我找到了关于这个问题的更多信息:
http://www.nsbasic.com/blog/?p=928 http://www.nsbasic.com/blog/?p=928
显然,保存到主屏幕的 wep 应用程序现在被视为本机应用程序,这意味着保存到主屏幕的同一 Web 应用程序的每个实例都有自己的“存储沙箱”。因此,该数据独立于移动 Safari 中保存的数据。这意味着,如果您删除所有移动 Safari 的网站数据,这对保存到主屏幕的网络应用程序没有影响(在 ios6 之前,它们共享相同的数据)。
我还发现了这个:
iOS 6 破坏了 web 应用程序中的 GeoLocation(支持 apple-mobile-web-app) https://stackoverflow.com/q/12503815/1254555
虽然不完全相同的主题,但可能相关。显然,网络应用程序保存到主屏幕使用
<meta content="yes" name="apple-mobile-web-app-capable" />
将无法使用地理位置。仅当您从网络应用程序中删除此元标记时,地理位置才起作用。也许这也是缓存问题的解决方法,我还无法测试它。但话又说回来:如果保存到主屏幕的 Web 应用程序更像本机应用程序,也许不再需要 cache.manifest?如果我了解更多信息,我会在这里报告。
EDIT2:
好吧,经过一些测试,网络和苹果都没有提供有用的提示,我至少发现了一些东西:当我删除
<meta content="yes" name="apple-mobile-web-app-capable" />
从网站上来看,一切当然都工作正常,因为就像你打开 Safari 一样,到目前为止我没有遇到任何问题。所以我的兴趣是让它在没有浏览器的情况下工作。如上所述,缓存仅达到 99%,然后我收到缓存大小配额超出错误。然后我关闭了主屏幕应用程序并再次打开它。现在缓存下载再次开始并完成得很好!没有冻结,没有错误!一切似乎都存储在本地。今天我只能在 iPad 模拟器上进行测试,但我希望稍后拿到我们的设备后能够尽快确认这一点。
因此,看起来不是询问您是否要增加缓存大小,而是得到缓存大小配额超出错误。也许因为现在主屏幕应用程序的数据存储处理方式不同,您不必再手动增加缓存大小(这当然纯粹是猜测)。不过,如果是这样的话,应该不会有任何错误。因此,您不必被要求增加缓存大小,而必须打开主屏幕应用程序两次,顺便说一句,这是一个非常蹩脚的解决方法......
EDIT3:
我只能在真实设备上确认此行为:保存到主屏幕 -> 从主屏幕打开 -> 下载要缓存的文件 -> 最后缓存大小配额超出错误 -> 关闭主屏幕应用程序(按主页按钮) - > 再次重新打开它 -> 再次下载缓存文件 -> 这次没有错误 -> 一切都可以离线使用。
我还在装有 iOS 5 的设备上对其进行了测试,它按预期工作,没有错误。所以这绝对是 iOS 6 的问题。
其他人可以确认这种行为或错误吗?
EDIT4:
我偶尔有机会在 iOS 6.1.3 上测试这个 - 不幸的是仍然是相同的行为......