我开发了一款使用appcache的iPad网络应用。它不是一个完全脱机的应用程序,但我使用appcache存储大型图像文件,以便它们不通过3G发送。问题是当清单更新时,appcache会更新iPad是否支持wifi或3G,这可能很昂贵。
是否可以让用户决定是否可以更新appcache?从我所看到的,这是不可能的,这一切都是自动发生的,你只是得到事件。但也许有一些诡计就像在飞行中或类似地写清单。
如果有帮助,请在服务器端使用PHP。感谢。
答案 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以跟踪加载/缓存的图像。
答案 1 :(得分:1)
我不知道indexedDB在iPad上的状态是什么,但这可能是另一种解决方案。
简而言之: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);