2

I've developed an iPad web app that uses the appcache. It's not intended to be a fully offline app but I use the appcache to store large image files so that they're not sent over 3G. Problem is when the manifest is updated the appcache updates whether the iPad is on wifi or 3G, which could be expensive.

Is it possible to have the user decide if the appcache can be updated or not? From what I've seen, this isn't possible, it all happens automatically, you just get events. But perhaps there's some trickery like writing the manifest on the fly or similar.

Using PHP on the server side if that helps. Thanks.

4

3 回答 3

5

连接类型:理论与未来

W3C上的网络信息 API 规范草案提供了连接类型的信息(以太网 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():(文档

现实

不幸的是,Net Info API 目前不可用(至少没有普及),但肯定会在未来有所帮助。

远射

一个包含网络速度的数据库(DIAL = 拨号,DSL = 宽带/电缆,COMP = 公司/T1),但我没有使用它,我怀疑它会有所帮助。

动态应用缓存

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

替代解决方案

HTML5 应用程序缓存目前是一头未驯服的野兽,并且正在讨论改进它。在它改变以支持更复杂的配置(带宽级别标志会很棒)之前,您可以改变对解决方案的看法,尽管 App Cache 可能是您目前拥有的最好的。

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

  • 首先在您的图像 HTTP 标头上添加一个远在未来的到期日期
  • 在页面加载时,从 imgs 中删除所有 src
  • 循环图像并检查 localStorage 是否在过去加载了每个图像
  • 如果有过去未加载的图像,则显示一个对话框,确认下载这些图像
  • 如果图像是过去加载的,则将src放回img上
  • 对于下载的每个图像,将其 URL 保存在 localStorage
于 2012-10-14T19:59:37.497 回答
1

我不知道 iPad 上 indexedDB 的状态如何,但这可能是一种替代解决方案。

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

你可以用 indexeddb 做什么:

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

  • 检查每个图像标签是否存在于 indexeddb 中
  • 如果在场
    • 从 indexeddb 中获取图片并放入图片标签中
  • 如果不存在
    • 下载它
    • 将其存储在 indexeddb 中
    • 将图像放在图像标签中。

作为额外的(将来),您可以按照 Sev 的说明进行操作:检查连接类型,并且仅在使用快速 Internet 连接时才下载图像。

于 2012-10-19T06:36:38.500 回答
0

我已经“发明”了一个在 iPad (iOS 6.0.x) 上开发 web 应用程序的可行解决方案,可以回答您的问题。

这个想法是首先检查是否设置/定义了 localstorage 变量(我使用页面的标题,因此使用 webapp 名称。)

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

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

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

于 2013-05-18T05:12:13.243 回答