2013-04-26 11 views
6

Ich habe manyquestions gesehen, die fragen (und antworten), wie Sie Anmeldeinformationen angeben, wenn Sie im Voraus wissen, dass die Anforderung sie erfordert.Wie kann ich eine Authentifizierungsanforderung von einem UIWebView erkennen?

Wenn ich eine Website laden, die eine Authentifizierungsanforderung anfordert, (reagiert mit HTTP 401), meine UIWebViewDelegate nur folgenden Rückrufe erhält: webView:shouldStartLoadWithRequest:navigationType: und manchmal webViewDidStartLoad: (webViewDidStartLoad: wenn ich direkt auf die Website navigieren genannt zu werden scheint, und es scheint nicht angerufen zu werden, wenn ich dorthin umgeleitet werde).

Durch -[NSObject respondsToSelector:] zwingende erhält der UIWebViewDelegate einige Anrufe zu uiWebView:resource:canAuthenticateAgainstProtectionSpace:forDataSource: und uiWebView:resource:didReceiveAuthenticationChallenge:fromDataSource:, die nützlich sein könnten, aber natürlich sind solche private API und wird wahrscheinlich meine App abgelehnt bekommen.

Ich habe ein paar verschiedene Mainstream-Apps mit eingebetteten UIWebView s getestet. Bisher werden diese Authentifizierungsanforderungen nur von Chrome ordnungsgemäß verarbeitet. Ich habe sogar meinen eigenen Server eingerichtet und das Chrome nur POST s einmal validiert. Twitter und Tweetbot scheitern einfach nur den Ladebildschirm für immer zu zeigen, genau wie meiner.

Gibt es einen anderen (wahrscheinlich sehr hacky) Weg, diese Authentifizierungsherausforderungen zu erkennen, außer mit einem zweiten spekulativen NSURLConnection? Wenn ich eine POST Anfrage machen, wird das alles POST alles, was schlecht ist.

I've added a radar to request an enhancement to UIWebView for this. Bitte duplizieren Sie es.

+0

Vielen Dank für die Radar-Anfrage - ich habe es getäuscht! –

Antwort

6

Apple now has sample code that solves this problem. Es sieht auch wie die vollständigste Dokumentation aus, wie ein NSURLProtocol ordnungsgemäß implementiert wird.

+0

Ich habe Probleme mit diesem Beispielcode. Einer meiner NSURLConnections empfängt keine Rückrufe mehr. Dies scheint jedoch immer noch die beste Option zu sein. Ich habe eine TSI mit DTS eingereicht, und hoffentlich kann Apple mir helfen, mein Problem zu lösen. –

+1

Mein Problem trat auf, weil ich ein anderes 'NSURLProtocol' hatte, das eine' NSURLConnection' verwendete, die 'UIWebView'-Aufrufe abfing. Nach dem Gespräch mit Apple DTS klingt es so, als ob man 'NSURLConnection'-basierte' NSURLProtocol's nicht mit 'UIWebView' verwenden kann. Apples Beispielcode verwendet 'NSURLSession', also ist es in Ordnung. –

3

Sie könnten alle Anfragen in Ihrem eigenen NSURLConnection laden und dann die Daten in die Webansicht als String einspeisen. Dies würde Ihnen erlauben, die Verbindung in ihrer ganzen Pracht abzufangen und trotzdem das native UIWebView Rendering zu erhalten. Ich bin mir nicht sicher, ob es gut funktionieren würde, die Daten in die Web-Ansicht zu streamen, wenn sie ankommt, aber hoffentlich sprechen wir hier nicht über zu viele Daten.

+0

Danke. Das mache ich jetzt. –

+0

Es würde mich interessieren zu hören, entweder hier oder auf Twitter, wie es funktioniert, besonders wenn Sie versuchen, die HTML-Zeichenfolge inkrementell zu laden. –

+0

Ich plane nicht, inkrementelles Laden zu machen. Ich werde versuchen, darüber zu bloggen, sobald ich es in Gang gebracht habe. –