6

我正在为 iPad(运行 iOS 6+)构建一个 web 应用程序,显示公司的产品集合。

这一切都使用 HTML5 的“cache.manifest”文件完美运行。但由于缓存已增长到大约 50MB,iPad 不再保存应用程序数据。根据 Safari 设置,缓存大小现在是 0.1KB,而不是 50MB。

那么 Safari 对 Web 应用程序缓存的实际限制是多少?有没有办法扩大应用程序缓存的最大数量?

4

1 回答 1

12

2014 年 6 月 2 日编辑:iOS7.1 上的最大缓存大小为 300Mb。

最近一个客户问了我这个确切的问题,所以我进行了调查。

根据 IOS6(我所有的测试都在iOS6.1上完成),这是两件不同的事情:

  • 使用 .manifest 的网站,可通过移动 Safari 访问
  • 从网站创建的主屏幕上的 webapp

带有 .manifest 的网站可以使用最多 50mb 的缓存,但需要用户许可。它不能使用更多。这个值可以在settings/safari/advanced中找到并清除。如果您尝试在缓存中填充更多内容,error则会触发一个事件并且该事件将变为window.applicationCache.status空闲状态。

webapp 与其网站不共享相同的缓存。清除缓存设置/safari/advanced 不会为您的主屏幕 webapp 做任何事情。它会在没有用户输入的情况下接受超过 50mb 的缓存,但我不知道具体有多少(我用 60mb 测试成功,完全可以离线访问。*编辑:用 83mb 尝试,成功)我不知道这些数据在哪里可以在 iOS 设置中看到。估计无处可去。

在我找到规范之前,测试这是一个痛苦的 *** 。有一个在 iOS6 上完美运行的 API。
您应该检查一下window.applicationCache.status,它会告诉您应用程序的状态是什么,以及以下事件(从我的代码中剪切和粘贴,因此使用他们的侦听器):

window.applicationCache.addEventListener('checking', onChecking);
window.applicationCache.addEventListener('noupdate', onNoupdate);
window.applicationCache.addEventListener('downloading', onDownloading);
window.applicationCache.addEventListener('progress', onProgress);
window.applicationCache.addEventListener('cached', onCached);
window.applicationCache.addEventListener('updateready', onUpdateready);    
window.applicationCache.addEventListener('obsolete', onObsolete);
window.applicationCache.addEventListener('error', onError);

所有人都在 iOS 6.1 上工作,即使progressevent.loadedevent.total

Web 应用程序首先检查,然后noupdate在 .manifest 相同时触发。状态为IDLE

如果 .manifest 更改,状态为DOWNLOADINGprogress则为清单中的每个文件触发事件,然后状态为UPDATEREADYupdateready触发。

如果您处于离线状态,则会触发一个error事件并且状态为IDLE

您可以使用以下命令测试在线/离线状态

var online = navigator.onLine ? 'online' : 'offline';

它有效,但规格说它不可靠。

还有三件事要完成:

  • 我的清单被命名为 cache.manifest 并像这样声明<html manifest="cache.manifest">
  • 我的 .htaccess 有AddType text/cache-manifest manifestExpiresByType text/cache-manifest "access plus 0 seconds"
  • 我的应用有<meta name="apple-mobile-web-app-capable" content="yes">

使用此 API,可以更轻松地了解幕后发生的事情。不过一定要自己做测试,我不能 100% 确定这个结果,或者他们可以使用新的 iOS 版本。我将进一步测试最大尺寸。

于 2013-02-19T18:27:29.207 回答