UIWebViewDelegate überwacht XMLHttpRequest nicht?
Ist es wahr, dass die UIWebViewDelegate keine überwachung von Anfragen erfolgt über ein XMLHttpRequest-Objekt? Wenn ja, gibt es eine Möglichkeit zu überwachen, diese Art von Anfragen?
z.B. UIWebViewDelegate nicht fangen diese in -(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
;
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.google.com", true);
xhr.onreadystatechange=function()
{
if (xhr.readyState==4)
{
alert(xhr.responseText);
}
}
xhr.send();
InformationsquelleAutor der Frage Thys | 2011-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Interessante Frage.
Es gibt zwei Teile, um diese Arbeit zu machen: ein JavaScript-handler und UIWebView delegate-Methoden. In JavaScript können wir ändern Prototypen Methoden, um Ereignisse auszulösen, wenn ein AJAX-request ist erstellt. Mit unseren UIWebView delegieren, wir können diese Ereignisse erfasst.
JavaScript-Handler
Müssen wir benachrichtigt werden, wenn ein AJAX-request gemacht wird. Ich fand die Lösung hier.
In unserem Fall, um den code zu arbeiten, habe ich die folgende JavaScript in eine Ressource namens " ajax_handler.js, die gebündelt mit meiner app.
Was dies tatsächlich zu tun ist, ändern Sie den Speicherort der browser einige aus URL-Schema (in diesem Fall mpAjaxHandle) mit info über die Anfrage gemacht. Keine Sorge, unsere Delegierten mit erwischen, und die Lage wird sich nicht ändern.
UIWebView Delegieren
Zuerst müssen wir Lesen unsere JavaScript-Datei. Ich schlage vor, dabei speichern Sie es in einer statischen Variablen. Ich bin in der Gewohnheit, mit +initialisieren.
Als Nächstes wollen wir injizieren das JavaScript, bevor eine Seite vollständig geladen, so können wir erhalten für alle Veranstaltungen.
Schließlich wollen wir erfassen die Veranstaltung.
Da das URL-Schema aus, wir wollen nicht wirklich Folgen. Wir kehren KEINE und alles ist gut.
Erstellte ich ein Beispielprojekt mit der Lösung aber noch nirgends zu hosten. Können Sie mir Nachricht, wenn Sie hosten kann, und ich werde Bearbeiten Sie diese post entsprechend.
InformationsquelleAutor der Antwort Mike Pulaski
Können Sie eine NSURLProtocol. Zum Beispiel, wenn Sie anrufen XMLHttpRequest mit
http://localhost/path
Sie behandeln können es mit dem folgenden:Dann für die Umsetzung:
Müssen Sie sich das Protokoll wie folgt:
InformationsquelleAutor der Antwort George
Durch die Umsetzung und Registrierung einer Unterklasse von NSURLProtocol können Sie erfassen alle die Anforderung aus dem UIWebView. Es kann overkill in einigen Fällen aber, wenn Sie sind nicht in der Lage, ändern Sie die javascript tatsächlich ausgeführt werden, es ist Ihre beste Wette.
In meinem Fall, die ich brauche, um alles einfangen zu können, Anfrage, und legen Sie eine spezifische HTTP-header von jedem von Ihnen.
Ich haben dies durch die Umsetzung NSURLProtocol, registrieren Sie es mit registerClass und die Beantwortung JA in meiner Unterklasse + (BOOL)canInitWithRequest:(NSURLRequest *)request, wenn der Antrag entspricht den URLs, ich bin interessiert.
Sie haben dann zu implementieren, die andere Methoden des Protokolls kann dies durch die Verwendung einer NSURLConnection, Einstellung der Protokoll-Klasse zu delegieren und umleiten der delegate-Methoden von NSURLConnection zu NSURLProtocolClient
InformationsquelleAutor der Antwort terrinecold
Scheint es, um wahr zu sein. Es gibt keinen Weg, um zu überwachen, was ein UIWebView ist dabei über das hinaus, was UIWebViewDelegate bietet, es sei denn, vielleicht können Sie herausfinden, ein Weg, um
stringByEvaluatingJavaScriptFromString:
Spritzen einige Javascript zu tun, was Sie brauchen.InformationsquelleAutor der Antwort Anomie
Als andere Völker erwähnt, UIWebViewDelegate beobachtet Veränderungen der Fenster.Lage und iframe.src nur.
In Fall, dass Sie nur wollen, verwenden Sie die benutzerdefinierte url-Schema von iOS nur,
Sie können die Vorteile
<iframe>
gerne auf diese Weise.Zum Beispiel, wenn Sie anrufen möchten, ein URL-Schema wie dieses
in Ihre js-Datei:
InformationsquelleAutor der Antwort Soyoes