控制appcache下载

时间:2012-10-02 22:28:49

标签: html5 ios6 html5-appcache

我开发了一款使用appcache的iPad网络应用。它不是一个完全脱机的应用程序,但我使用appcache存储大型图像文件,以便它们不通过3G发送。问题是当清单更新时,appcache会更新iPad是否支持wifi或3G,这可能很昂贵。

是否可以让用户决定是否可以更新appcache?从我所看到的,这是不可能的,这一切都是自动发生的,你只是得到事件。但也许有一些诡计就像在飞行中或类似地写清单。

如果有帮助,请在服务器端使用PHP。感谢。

3 个答案:

答案 0 :(得分:5)

连接类型:理论&将来

draft spec of Network Information API on W3C提供连接类型的信息(ethernet wifi 2g 3g 4g等),但除了以下任何浏览器之外还没有实现:

  • Android 2.2及更高版本的Android浏览器(不是Google Chrome浏览器)

    navigator.connection.type //基于W3C草案,(在Android浏览器上实施)

  • PhoneGap这不完全是一个浏览器

    navigator.network.connection.type //在PhoneGap上

将来有了这些信息,您可以检测到用户是否有蜂窝数据,然后暂时删除图像的src并通过确认对话框询问用户。

您可能还必须使用以下命令取消应用缓存更新: window.applicationCache.abort()documentation

现实

不幸的是,Net Info API暂时不可用(至少不普及),但肯定会在将来有所帮助。

远射

a database包括网络速度(DIAL =拨号,DSL =宽带/有线,COMP =公司/ T1),但我没有使用它,我怀疑它会有所帮助。

动态应用缓存

在检查时,我尝试生成html标签以及动态清单声明,以便将其与Network Info API结合使用,但AppCache清单在javascript执行之前加载,之后不受影响。 因此,无法通过Javascript动态更改清单文件,并且数据URI不是一个选项。

替代解决方案

HTML5应用程序缓存目前是一个野性的野兽,有talks to improve it。在它更改为支持更复杂的配置(带宽级别标记会很棒)之前,您可以更改解决方案的视角,尽管App Cache可能是您目前最好的。

根据您的图片有多大,您可以依赖普通的浏览器缓存。您可以合并localStorage和远期expiration HTTP headers。 LocalStorage以跟踪加载/缓存的图像。

  • 首先在图片HTTP标头
  • 上添加远期日期
  • 在页面加载时,从imgs中删除所有src
  • 循环图像并检查localStorage是否已在过去加载每个图像
  • 如果有过去未加载的图像,请显示确认下载这些图像的对话框
  • 如果图像是过去加载的,则将src放回img
  • 对于下载的每个图像,请将其URL保存在localStorage

答案 1 :(得分:1)

我不知道indexedDB在iPad上的状态是什么,但这可能是另一种解决方案。

简而言之:Indexeddb是一个客户端数据库。数据存储在作为键/值对的对象库中。理论上,最大存储容量是磁盘空间的最大值。有关indexeddb的更多信息:

使用indexeddb可以做什么:

当有人导航到某个页面时:

  • 检查indexeddb
  • 中是否存在每个图片代码
  • 如果有的话
    • 从indexeddb获取图像并将其放入图像标记
  • 如果不存在
    • 下载
    • 将其存储在indexeddb
    • 将图片放入图片标记。

作为额外的(将来),您可以按照Sev的说明进行操作:检查连接类型,仅在处理快速互联网连接时下载图像。

答案 2 :(得分:0)

我已经'发明'了一个在iPad(iOS 6.0.x)上开发webapp的工作解决方案,可以回答你的问题。

首先要检查是否已设置/定义localstorage变量(我使用页面标题,即webapp名称。)

如果此localstorage变量存在,则假设(在webapp沙箱上下文中)它是第一次运行应用程序。此时,我将一个UUID与$PHP_SESSION($uuid)一起填充,以避免服务器端PHP域中的“交叉应用程序污染”。 除此之外,我还有一个动态manifest.appcache.php,它在CACHE部分中包含要添加到清单的文件列表。因此;

<?
echo $manifest_file_list[0]."\n";
?>

使用JS appcache清单事件监听器然后我将监控进度监视为$('#manifestappcache').html(result);