5

我正在开发一个使用应用程序缓存的网络应用程序,并且在桌面浏览器和 Android 上一切正常(即使是非常旧和慢速的 android 手机)。然而,在 Safari 和 Chrome 的 iOS 6 上下载 appcache 需要的时间要长得多。

我的应用程序缓存大小只有 2.1Mb,而且我有一个非常稳定的 70Mbps(下载)互联网连接。我希望缓存会很快。

到目前为止,这是我的时间:

  • 桌面 Chrome:<1 秒 (Safari 和 Firefox 的时间相似)
  • Android 2.3.3 Stock Browser:~4s (Chrome 和 Dolphin 的时间相似)
  • Android 4.2.2(模拟):~7s(在PhoneGap应用程序中运行)
  • iPhone 4S 6.0 Safari:8 分钟!!!(在 iOS Chrome 中也差不多!!)
  • iPad 2 6.0 Safari:同上!!!

所有这些设备都使用相同的 wifi 和互联网连接,我的 iPhone/iPad 运行良好(没有本地应用程序出现互联网速度问题,常规网站加载正常)。在 iOS 下似乎有一些东西绝对会降低 AppCache 的下载速度。

window.applicationCache.status这段时间内appCache.DOWNLOADING,我有一个progress事件正在运行,在下载文件时对文件进行计数,所以我确定它没有卡在其他地方。这似乎只是下载所需的时间。是什么赋予了?

附录:iPhone 运行起来也非常热,并且在此操作过程中电池电量会很快下降。在此下载过程中,似乎有什么东西导致 CPU 完全耗尽。

(注意:由于我们仍处于私人测试阶段,因此我无法在此处发布指向网络应用程序的链接,但如果您需要先查看它,然后您认为您可以帮助诊断它,请发送电子邮件至我的个人资料中的地址,我将发送一个指向该应用程序的链接)。

4

2 回答 2

2

好的,我在 iOS 模拟器和 Xcode Instruments 的帮助下解决了这个问题。(我不确定是否应该将我的解决方案添加到主要问题中,或者作为答案,但我想我会这样做,因为我的问题已经有点混乱了)。

事实证明,实际上是一些错误的 javascript 导致了这个问题,但显然只在 iOS 上。

该网络应用程序旨在仅是单页高(没有垂直滚动,除非在特定DIVs 内),因此除了用于隐藏地址栏的常用标准 JS 代码......

        window.addEventListener("load",function() {
            // Set a timeout...
            setTimeout(function(){
                // Hide the address bar!
                window.scrollTo(0, 1);
            }, 0);
        });

...我还添加了以下内容:

        $(document).scroll(
            function(e){
                window.scrollTo(0, 1);
            });

通过查看配置文件结果,我可以看到花费了很多时间scrollTo,因此它立即指出这是原因。为什么scroll事件被触发这么多,我不知道(这是在没有触摸屏幕的情况下发生的)。

我最初的解决方法是限制该代码,但我现在正在评估我是否需要它。这是我现在修复它的代码(使用jquery-debounce,我已经将它用于其他东西):

        $(document).scroll(
            $.throttle(function(e){
                window.scrollTo(0, 1);
            })
        , 10);

应用缓存的下载时间现在与安卓时代一致。呸!

于 2013-04-10T23:33:14.987 回答
0

代码正在进入一个无限循环,因为初始的 scrollTo 函数调用触发了滚动事件处理程序,然后它会反复重新触发自己!我最好的猜测是 iOS JavaScript 引擎处理这个无限循环的方式与其他浏览器的 JavaScript 引擎不同。

于 2014-01-21T10:17:34.430 回答