4

我正在使用 Mobile Safari 的缓存清单文件来存储在 iPod Touch(版本 3.1.3)上以离线模式运行的多页数据输入应用程序。应用程序通过persistence.js ORM写入客户端数据库。这一切都很好。

但是,我偶尔会遇到非常难以重现的问题,Safari 似乎只是忘记了页面已被缓存。发生这种情况时,会出现“无法打开页面”警报,这与您尝试在关闭 wi-fi 的情况下访问非缓存网站时出现的警报相同。我发现解决此问题的唯一方法是重新连接到无线信号并在线访问该站点,这似乎可以直接设置缓存。当您在办公室时,这很容易做到,但在外地做到这一点并不容易。

我没有尝试引用缓存资源之外的任何内容,并且我已经通过在断开连接时运行整个站点来验证应用程序是否被缓存,有时会连续几天成功。我觉得操作系统中有一个错误会影响缓存的有效性。我不一定要寻找问题的解决方案(但这会很好),而只是确认其他人遇到了这个问题。

4

1 回答 1

2

使用缓存清单和大量故障排除,我能够可靠地缓存整个应用程序;请注意,这是一个单页应用程序,只有几个单独的文件资源。

作为进一步的增强,我一直在尝试修改基于

window.applicationCache 状态

通知用户有关更新,即:

点击此处应用更新

如果可能的话,我可以交换缓存

window.applicationCache.swapCache();

这将允许我交换更新的缓存,然后重新启动页面以提供简化的更新机制。

可能比苹果商店的应用程序更精简。

我怀疑 applicationCache API 是因为这个原因被 Apple 阻碍了 Web 应用程序。话虽如此,我相信移动设备上对“html5”API 的支持水平是苹果 safari 中最强大的。

以下是我目前注意到的一些问题,不分先后。请注意,这不是一个完整的错误列表。

我从来没有收到“updateready”事件;此警报线永远不会运行:

window.applicationCache.addEventListener('updateready', function(e) {
    alert('updateready event status=' + window.applicationCache.status );
}, false);

我无法手动检查更新。以下代码给了我一个例外

    try{
        window.applicationCache.update();
    }catch (err){
        alert('exception:\n' + err);
    }

似乎只要我开始与缓存状态交互,缓存就会停止工作。这些错误非常难以捉摸。确定和隔离任何一个问题可能会花费大量时间,尤其是因为所有这些代码都可以在其他浏览器(chrome)上完美运行。

现在有一个好消息:我怀疑如果您将应用程序固定到主屏幕,iCloud“备份”资源并在您第一次从主屏幕运行应用程序后恢复它们。为避免此问题,您有时可能必须重命名文件。我已经证明苹果通过以下方式对过时的组件进行离散备份

从我的应用服务器中完全删除它们

从主屏幕删除固定的网络应用程序

清除所有缓存

在 safari 中打开应用程序 url

验证其是否为最新版本

钉在家里

验证固定的应用程序是否为最新版本

关闭它

再次运行 - 它回到旧的,不再在您的服务器上。

最后,如果您在手机处于飞行模式时运行固定的应用程序,iCloud 将无法恢复过时的文件。这证明它来自空中。

于 2012-03-27T18:16:59.447 回答