iOS上的AppCache令人难以忍受

时间:2013-04-10 21:26:36

标签: javascript ios web-applications application-cache

我正在开发一个利用应用程序缓存的网络应用程序,一切都在桌面浏览器和Android上运行良好(即使是非常老旧的Android手机)。但是,在Safari和Chrome中,下载appcache在iOS 6上花费的时间要长得多。

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

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

  • 桌面Chrome:< 1s (与Safari和Firefox类似的时间)
  • Android 2.3.3 Stock浏览器: ~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在下载期间运行平稳。

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

2 个答案:

答案 0 :(得分:2)

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

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

web-app只是一个单页高(没有垂直滚动,特定DIV除外),所以除了通常的标准JS代码隐藏地址栏... < / p>

        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);

应用程序缓存的下载时间现在与Android时间一致。呼!

答案 1 :(得分:0)

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