2013-04-10 163 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引擎不同。