2013-04-10 80 views
5

我正在开发一个利用应用程序缓存的网络应用程序,并且所有功能在桌面浏览器和Android上都很出色(甚至很老的&慢速Android手机)。然而,在iOS和Safari浏览器中,下载AppCache的时间要长得多。AppCache在iOS上极其缓慢iOS

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

这里是我的时代至今:

  • 桌面版Chrome:< 1S(Safari浏览&类似次火狐)
  • 的Android 2.3.3股票的浏览器:〜4S(类似的时间为Chrome & Dolphin)
  • Android 4.2.2(仿真):〜7s(运行在PhoneGap应用程序内)
  • iPhone 4S 6.0 Safari:8分钟!!!(大约相同的iOS Chrome也是!!)
  • iPad 2 6.0 Safari:同上!!!

所有这些设备都使用相同的无线网络和互联网连接,和我的iPhone/iPad上的运作,否则罚款(没有本地应用程序表现出上网速度问题,并定期网站负载就好了)。在iOS下,似乎有绝对贬低AppCache下载速度的东西。

整个这段时间内的window.applicationCache.statusappCache.DOWNLOADING,而且我有一个progress事件在下载文件时计算这些文件,所以我确信它并没有卡在其他地方。这似乎是下载所需的时间。是什么赋予了?

附录:iPhone也运行得非常热,电池在此操作过程中会很快滴下。看起来东西导致CPU在此下载过程中平滑运行。 (注意:由于我们仍在私人测试版中,因此我无法在这里发布网络应用程序的链接,但是如果在您认为能够帮助诊断之前需要查看该链接,通过我的个人资料地址向我发送电子邮件,然后我会发送一个链接到应用程序)。

+2

要开始,请在其上投掷TCP嗅探器(如[Wireshark](http://www.wireshark.org/)),以了解设备/服务器在8分钟内的对话情况。 – 2013-04-10 21:56:56

回答

2

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

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

该网页应用程序的目的是只有一个单一的页面高(没有垂直滚动,除了在特定的DIV s),所以除了通常的标准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); 

应用程序缓存的下载时间现在是在与Android的时代潮流。唷!

0

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