2013-04-10 20 views
5

Ich entwickle eine Web-Anwendung mit Application Cache, und alles funktioniert gut auf Desktop-Browsern und auf Android (sogar sehr alt & langsamen Android-Handys). Das Herunterladen des Appcache dauert jedoch sowohl in Safari als auch in Chrome viel länger auf iOS 6.AppCache quälend langsam auf iOS

Meine Anwendung Cache insgesamt Größe ist nur 2.1Mb, und ich habe eine ziemlich solide 70Mbps (Download) Internet-Verbindung. Ich würde erwarten, dass Caching ziemlich schnell ist.

Hier sind meine Zeiten so weit:

  • Desktop-Chrome: < 1s(ähnlich Zeiten für Safari & Firefox)
  • Android 2.3.3 Auf Browser: ~ 4s(ähnliche Zeiten für Chrome & Dolphin)
  • Android 4.2.2 (emuliert): ~ 7s (läuft in einer PhoneGap App)
  • iPhone 4S 6.0 Safari: 8 Minuten !!! (etwa in iOS Chrome auch !!)
  • iPad 2 6.0 Safari: wie oben !!!

Alle diese Geräte sind mit dem gleichen Wi-Fi und Internet-Anschluss, und mein iPhone/iPad sonst funktioniert in Ordnung (keine native Anwendungen Internet-Geschwindigkeitsprobleme aufweisen und regelmäßige Websites Last nur in Ordnung). Es scheint nur etwas zu geben, das die AppCache-Download-Geschwindigkeit unter iOS absolut dezimiert.

Die window.applicationCache.status während dieser Zeit ist appCache.DOWNLOADING, und ich habe ein progress Ereignis laufen die Dateien zu zählen, wie sie heruntergeladen werden, so bin ich sicher, dass es nicht an anderer Stelle geklebt wird. Dies scheint nur die Zeit zu sein, die zum Herunterladen benötigt wird. Was gibt?

Nachtrag: Das iPhone läuft auch lächerlich heiß, und die Batterie tickt sehr schnell während dieses Vorgangs. Es scheint, dass etwas bewirkt, dass die CPU während dieses Downloads flattert.

(Hinweis: Ich kann hier keinen Link zur Web-App veröffentlichen, da wir noch in der privaten Betaversion sind, aber wenn Sie es sehen müssten, bevor Sie glauben, dass Sie es bei der Diagnose unterstützen könnten, E-Mail an die Adresse in meinem Profil und ich werde einen Link zur App senden).

+2

Um zu starten, werfen Sie einen TCP-Sniffer darauf (wie [Wireshark] (http://www.wireshark.org/)), um eine Vorstellung davon zu bekommen, wie die Konversation zwischen dem Gerät/Server während dieser 8 Minuten aussieht . –

Antwort

2

Okay, ich habe es mit Hilfe des iOS-Emulators und Xcode Instruments herausgefunden, um es zu profilieren. (Ich bin nicht sicher, ob ich meine Lösung in die Hauptfrage oder als eine Antwort hinzufügen sollte, aber ich dachte, ich würde es so machen, da meine Frage schon ein wenig überladen ist).

Wie sich herausstellt, war es tatsächlich einige fehlerhafte Javascript verursacht das Problem, aber anscheinend nur auf iOS.

Die Web-App soll nur eine einzelne Seite hoch sein (kein vertikales Scrollen, außer innerhalb spezifischer DIV s), also neben dem üblichen Standard-JS-Code zum Ausblenden der Adressleiste ...

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

... hatte ich auch in der folgenden hinzugefügt:

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

an den Profil Ergebnisse von der Suche, ich war in der Lage, dass ein viel Zeit zu sehen in scrollTo ausgegeben wurde, Also wies es sofort darauf als Ursache hin. Warum das scroll Ereignis so viel ausgelöst wurde, habe ich keine Ahnung (dies geschah ohne Berührung des Bildschirms überhaupt).

Meine erste Lösung ist es, diesen Code zu drosseln, aber ich evaluiere jetzt, ob ich überhaupt überhaupt Hilfe brauche. Hier ist der Code, den ich habe, dass es jetzt fixiert (mit jquery-debounce, die ich schon für etwas anderes verwendet wurde):

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

Die Downloadzeit des Anwendungscache ist jetzt im Einklang mit der Android-mal. Puh!

0

Der Code wird sich selbst in eine Endlosschleife, wie der anfängliche scrollTo Funktionsaufruf löst den Scroll-Event-Handler, der dann wiederholt sich selbst auslöst! Meine beste Vermutung ist, dass die iOS-JavaScript-Engine diese Endlosschleife anders als die JavaScript-Engines der anderen Browser behandelt.