2014 年 6 月 2 日编辑:
iOS7.1 的最大缓存大小为 300Mb。
最近一位客户问了我这个确切的问题,所以我进行了调查。
根据 IOS6(我所有的测试都是在 iOS6.1 上完成的),这是两件不同的事情:
- 使用 .manifest 的网站,可通过移动 Safari 访问
- 主屏幕上的网络应用程序,从网站创建
带有 .manifest 的网站在请求用户许可的情况下最多可以使用 50mb 的缓存。它不能使用更多。这个值可以在settings/safari/advanced中找到并清除。如果您尝试在缓存中填充更多内容,error 事件将被触发,window.applicationCache.status 将进入空闲状态。
Web 应用与其网站共享不同的缓存。 清除缓存设置/safari/advanced 不会对您的主屏幕 Web 应用执行任何操作。它可以在没有用户输入的情况下接受超过 50mb 的缓存,但我不知道具体有多少(我用 60mb 测试成功,完全可以离线访问。*编辑:用 83mb 尝试,成功)
我不知道在 iOS 设置中哪里可以看到这些数据。我猜哪里都没有。
在我找到spec 之前,测试这是一个痛苦的过程。有一个 API 可以在 iOS6 上完美运行。
您应该检查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,即使是 progress 事件与 event.loaded 和 event.total
Web 应用程序首先检查,如果 .manifest 相同,则触发 noupdate。状态为IDLE。
如果 .manifest 更改,状态为 DOWNLOADING,progress 事件为清单中的每个文件触发,然后状态为 UPDATEREADY,updateready 触发。
如果您处于离线状态,则会触发 error 事件并且状态为 IDLE。
您可以使用
测试在线/离线状态
var online = navigator.onLine ? 'online' : 'offline';
它有效,但规格表明它不可靠。
还有三件事要完成:
- 我的清单被命名为 cache.manifest 并像这样声明
<html manifest="cache.manifest">
- 我的 .htaccess 有
AddType text/cache-manifest manifest 和 ExpiresByType text/cache-manifest "access plus 0 seconds"
- 我的应用有
<meta name="apple-mobile-web-app-capable" content="yes">
使用此 API,可以更轻松地了解幕后发生的事情。不过一定要自己做测试,我不能 100% 确定这个结果,或者他们可以使用新的 iOS 版本。我会进一步测试最大尺寸。