Wie bekomme ich die letzten HTTP-Status-Code aus einer UIWebView?
Möchte ich erkennen, wenn eine Seite geladen Anfrage geben, um ein UIWebView hat wieder ein status-code in der 5xx oder 4xx Reihe.
Ich habe setup die Delegierten für die web-Ansicht und ein -webView:didFailLoadWithError:Fehler-Methode, aber obwohl es wird als gut für timeouts, es wird nicht aufgerufen, für HTTP-Status-Code-Fehler.
Irgendwelche Vorschläge?
InformationsquelleAutor der Frage oldbeamer | 2009-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hmmm... ich bin kein iPhone-Entwickler, aber....
Könnten Sie versuchen Sie, erstellen ein NSURLRequest mit der URL, die Sie laden möchten? Dann könnte man die Verbindung mit NSURLConnection.
NSURLConnection ein Delegat-Methode
geben wird, der die Antwort vom server. Bitte beachten Sie, dass wenn Sie die Verbindung über HTTP, wird die Antwort wirklich Klasse NSHTTPURLResponse. Die NSHTTPURLResponse kann verwendet werden, um den status mit den folgenden Instanz-Methode
NSURLConnection hat eine weitere delegate-Methode
kann verwendet werden, um die Daten aus dem URL-Verbindung. Sie konnte dann auch manuell laden Sie die Daten in Ihre UIWebView verwenden:
Scheint wie eine Menge Arbeit, aber es getan werden könnte. Ich hoffe, jemand anderes wird kommen mit den leichteren Weg, aber ich sehe es nicht.
InformationsquelleAutor der Antwort Jeff Hellman
Ich kämpfte mit diesem für eine Weile versuchen zu finden eine gute Antwort. Die Anforderungen, die ich arbeiten war unter war, dass ich brauchte, um in der Lage sein, um zu bestimmen, den status der ERSTEN Seite Last, und jede Last nach, würde ich davon ausgehen, dass sich der Benutzer auf links klicken, die sollte nicht gebrochen werden (kann nicht garantiert werden, ich weiß, aber viel besser als die alternativen).
Was ich am Ende dabei war Sie die erste nenne mich über eine NSURLConnection (synchron), und übergeben der Daten an die UIWebView.
Wenn Sie es wünschen, um die Informationen für jede Anfrage, können Sie einfach die Methode verwenden,
abfangen, die alle Anforderungen und machen Sie sich selbst. Sie haben eine Art von request-management-Technik, denn wenn Sie rufen Sie die loadData-auf der UIWebView, es ruft die shouldStartLoadWithRequest Rückruf, und Sie wollen sicherstellen, dass Sie don ' T tun eine unendliche Schleife machen, die gleiche Anfrage über und über.
InformationsquelleAutor der Antwort dsingleton
Derzeit UIWebView bietet keine Funktionalität für die erste HTTP-status-codes für die Anfragen geladen. Eine Problemumgehung ist die Anforderung abfangen Beladung von UIWebView mit der UIWebViewDelegate Methoden und NSURLConnection verwenden, um zu erkennen, wie der server reagiert auf diese Anfrage. Dann können Sie eine entsprechende Aktion geeignet für die situation. Dieser Artikel , erklärt der workaround im detail auf einem demo-Projekt.
Ist und Sie brauchen nicht weiter zu be-Antrag, nachdem Sie die Antwort erhalten. Sie können brechen Sie einfach die Verbindung in - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)Antwort Methode nach dem erlernen der HTTP-status-code. Diese Weise verhindern Sie, dass die Verbindung von be-unnötige-Antwort-Daten. Sie können dann laden Sie die Anfrage in UIWebView wieder oder zeigt eine entsprechende Fehlermeldung an den Benutzer abhängig von der HTTP-status-code, etc.
Hier ist der Artikel
und hier ist das demo-Projekt auf github
InformationsquelleAutor der Antwort Ahmet Ardal
Hier ist ein work-around, um HTTP-Antwort-code, aber mit Versand nur eine Anfrage zu jeder URL:-
InformationsquelleAutor der Antwort Shady Elyaski
Ich kämpfte sehr hart an diesem Thema, wenn die Dinge auf Swift 3.0 jetzt. Ich habe sogar erstellt eine benutzerdefinierte URLProtocol und versucht zu fangen alle von web-Anfragen, nur um zu erkennen schließlich, dass es unnötig war. Der Grund für die Verwirrung, für mich ist da, dass Sie sich in der didReceiveResponse Funktion:
zu NSURLConnectionDataDelegatedie erbt von NSURLConnectionDelegate.
Anyway, Hier ist der Swift-3.0-version, die funktioniert:
InformationsquelleAutor der Antwort Michael Shang
Als ich gerade gebucht auf ein anderer threadist es auch möglich abzufangen
NSURLRequest
auf der Ebene derNSURLProtocol
und erstellen Sie IhreNSURLResponse
dort, statt in Ihrem UIWebView Delegierte/- controller. Der Grund, warum dieser vorzuziehen ist, meiner Meinung nach, ist, dass er behauptet, die vorwärts/zurück-navigationsstapel des UIWebView. Die Gliederung der Vorgehensweise finden Sie in diesem hervorragenden blog-post von Rob Napier:http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588
und es gibt code auf GitHub:
https://github.com/rnapier/RNCachingURLProtocol
InformationsquelleAutor der Antwort DaGaMs
Hier ist ein schönes Beispiel, wo Sie eine Kombination erstellen einer NSURLConnection für den ersten laden, und die UIWebView für die nächsten Seiten:
http://www.ardalahmet.com/2011/08/18/how-to-detect-and-handle-http-status-codes-in-uiwebviews/
Im Grunde ist dies der wichtigste trick, mit dem JA/NEIN return-Wert shouldStartLoadRequest:
Das sollte erhalten Sie gehen, ohne mit synchronen Anforderungen, besonders in Verbindung mit Jeff ' s Antwort.
InformationsquelleAutor der Antwort Jelle
Leider derzeit wie es aussieht, die beste option ist zu verwenden -stringByEvaluatingJavaScriptFromstring: führen Sie eine Art kleines Skript, das die Abfragen der Beleg für seinen status code.
InformationsquelleAutor der Antwort Mike Abdullah
Was über die Implementierung
webViewDidFinishLoad:
auf IhreUIWebViewDelegate
und mit derrequest
Eigenschaft des UIWebView, um den Zugriff auf die Header, die Sie interessiert? So etwas (ungetestet):InformationsquelleAutor der Antwort Nathan de Vries