我正在为iPad(运行iOS 6+)构建一个网络应用程序,显示一家公司的产品系列。
使用HTML5的"cache.manifest"文件,一切都很完美。但由于缓存已增长到50MB左右,iPad不再保存应用程序数据。根据Safari的设置,缓存大小现在是0.1KB,而不是50MB。
那么,Safari对网络应用程序的缓存实际限制是多少?有没有办法扩大应用程序缓存的最大数量?
编辑2014年6月2日:iOS7.1中的最大缓存大小为300Mb。
最近一位客户问了我这个确切的问题,所以我进行了调查。
根据IOS6(我的所有测试都是在IOS6.1上完成的),这是两件不同的事情:
- 使用.manifest的网站,通过移动Safari访问
- 主屏幕上的网络应用程序,从网站创建
一个带有.manifest的网站在请求用户许可的情况下可以使用高达50mb的缓存。它不能再多用了。此值可以在设置/safari/advanced中找到并清除。如果您尝试在缓存中填充更多内容,error
事件将被激发,window.applicationCache.status
将变为IDLE。
网络应用程序与其网站不共享相同的缓存清除缓存设置/safari/advanced对主屏幕网络应用程序没有任何帮助。在没有用户输入的情况下,它将接受超过50mb的缓存,但我不知道具体有多少(我测试了60mb,成功了,完全可以离线访问。*编辑:尝试了83mb,成功了)我不知道在iOS设置中可以在哪里看到这些数据。我想不会。
在我找到规范之前,测试这是一件痛苦的事情。有一个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上工作,即使是带有event.loaded
和event.total
的progress
事件
Web应用程序从检查开始,然后在.manifest相同的情况下激发noupdate
。状态为IDLE
。
如果.manifest发生更改,则状态为DOWNLOADING
,为清单中的每个文件激发progress
事件,则状态是UPDATEREADY
,激发updateready
。
如果您处于脱机状态,则会触发error
事件,状态为IDLE
。
您可以使用测试在线/离线状态
var online = navigator.onLine ? 'online' : 'offline';
它有效,但规格说明它不可靠。
还有三件事要完成:
- 我的清单名为cache.manifest,声明如下
<html manifest="cache.manifest">
- my.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版本。我将进一步测试最大尺寸。