2011-01-14 3 views
7

Ich baue eine iPhone App, die eine UIWebView zeigt, die auf eine Webanwendung zeigt, die ich erstellt habe.Benutzerinteraktion schraubt manchmal jQuery Ajax Anfragen in UIWebView

Die Web-Anwendung macht häufige Webservice-Aufrufe für Datenelemente, die Steuerelemente auf einer Leinwand animieren werden verwendet, um. Die Aufrufe für Daten verwenden jQuery ajax, übergeben Parameter über JSON und empfangen eine XML-Antwort.

Ich finde, dass, während Benutzer-Interaktionen mit dem UIWebView auftreten, die Javascript-Methode setTimeout blockiert ist und scheint nicht überhaupt auszuführen. Meinetwegen; Es gibt Möglichkeiten, dies zu umgehen.

Aber das Hauptproblem ist, dass hin und wieder nach Benutzerinteraktionen (Zoomen, Schwenken usw.), die Ajax-Web-Service-Anrufe werden immer die ganze Zeit fehlschlagen und ich kann keinen Grund, warum. Auch wenn sie wiederholt gemacht werden, kommt in den nächsten Minuten keiner von ihnen überhaupt zum Webservice durch. Wenn Sie das UIWebView vollständig verlassen, werden sie niemals fehlschlagen, solange der Web-Service aktiv ist und die Verbindung besteht.

Kann jemand vorschlagen, warum, und wie man das umgeht/arbeitet?

Quick Update: nach dem Safari mobilen Debugger, das ‚Antwort‘ Objekt in der Fehlerfunktion ist nicht definiert. (Es funktioniert, wenn ich zum Beispiel die URL ungültig machen Dies kann dann von Objective-C durch genannt werden. [WebView stringByEvaluatingJavascript: @ „lasterror“], sondern löst eine Ausnahme für diese ‚berührte die UIWebView‘ Fehler):

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/GetValues", 
    async: true, 
    data: "{'pageVersionIndex': " + PageVersionIndex + " , 'timeStreamIndex': '" + TimeStream + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "xml", 
    success: function (response) { UpdateControls(response); }, 
    error: function (response, status, errorthrown) { 
     calling = false; 
     lastError = response.statusText; //Throws exception 
     connectionInterrupted = true; 
     DataRoutine = window.setTimeout(DataService, dataFrequency); } 
    }); 
+1

Ich denke, es wäre eine gute Idee sein, einen entsprechenden iPhone-Tag zu ersetzen, für eines der Tags, die du hast ("Web-Anwendungen" vielleicht). – Pointy

+0

Gute Idee, wird es tun. –

Antwort

2

ich fürchte, Sie werden geröstet ... in einer Art und Weise. In iOS Safari und in UIWebView haben Systemprozesse Vorrang vor Browsern und wenn plötzlich nach mehr CPU-Power oder Speicher für native Prozesse gefragt wird (wie zB Touch), kann es passieren, dass laufendes Javascript nicht mehr ausgeführt wird Speicherlast oder CPU-Nutzung. Der schlimmste Teil ist, dass es keine Fehler oder irgendetwas auswirft ... es stoppt nur die Codeausführung, als ob nichts passiert wäre.

Angst, dass, wenn es in Ihrer App viel passiert, der einzige Weg wäre, eine Art Timer hinzuzufügen, der zuhören würde, wenn die Anfrage nicht blockiert wäre - falls ja, wiederholen Sie den Vorgang bis erfolgreich.

Höhen und Tiefen von iOS - sie mögen Sie wirklich heimisch gehen eher dann web :)

hoffe, es hilft, Tom

+0

Danke für den Hinweis. Ich habe alle Möglichkeiten ausgeschöpft, und die einzige Möglichkeit, das Problem zu lösen, besteht darin, die Aufrufe des Webdienstes manuell mithilfe einer NSURLConnection auszuführen, anstatt die JavaScript-Methoden auf der Seite aufzurufen. Es gibt auch eine bessere Kontrolle über das Timing, den Wiederholungsversuch usw. –

Verwandte Themen