2013-04-26 16 views
6

Ho visto manyquestions che chiede (e rispondo) come fornire le credenziali quando si sa in anticipo che la richiesta le richiede.Come posso rilevare una richiesta di autenticazione da un UIWebView?

Quando carico un sito che richiede una richiesta di autenticazione, (risponde con HTTP 401), la mia UIWebViewDelegate riceve solo le seguenti callback: webView:shouldStartLoadWithRequest:navigationType: e talvolta webViewDidStartLoad: (webViewDidStartLoad: sembra essere chiamato se ci si dirige direttamente al sito, ed è sembra non essere chiamato se sono reindirizzato lì).

Con l'override -[NSObject respondsToSelector:], il UIWebViewDelegate riceve alcune chiamate a uiWebView:resource:canAuthenticateAgainstProtectionSpace:forDataSource: e uiWebView:resource:didReceiveAuthenticationChallenge:fromDataSource:, che potrebbe essere utile, ma naturalmente questi sono API privato e sarà probabilmente ottenere la mia app respinto.

Ho provato alcune diverse app tradizionali con incorporato UIWebView s. Finora, solo Chrome gestisce correttamente queste sfide di autenticazione. Ho persino impostato il mio server e convalidato quel Chrome solo POST s una volta. Twitter e Tweetbot non riescono a mostrare la schermata di caricamento per sempre, proprio come la mia.

C'è un altro modo (probabilmente molto hacky) per rilevare queste sfide di autenticazione oltre all'utilizzo di un secondo speculativo NSURLConnection? Se faccio una richiesta POST, questo raddoppierà- POST tutto ciò che è male.

I've added a radar to request an enhancement to UIWebView for this. Si prega di duplicarlo.

+0

Grazie per aver richiesto il radar: l'ho ingannato! –

risposta

6

Apple now has sample code that solves this problem. Sembra anche la documentazione più completa su come implementare correttamente un protocollo NSURL.

+0

Ho riscontrato problemi con questo codice di esempio. Uno dei miei NSURLConnections smette di ricevere i callback. Tuttavia, questa sembra ancora la migliore opzione là fuori. Ho presentato una TSI con DTS e spero che Apple possa aiutarmi a risolvere il mio problema. –

+1

Il mio problema si è verificato perché avevo un altro 'NSURLProtocol' che utilizzava un' NSURLConnection', che intercettava le chiamate di 'UIWebView'. Dopo aver parlato con Apple DTS, sembra che non sia possibile usare 'NSURLProtocol's basato su' NSURLConnection' con 'UIWebView'. Il codice di esempio di Apple utilizza 'NSURLSession' quindi va bene. –

3

È possibile caricare tutte le richieste nel proprio NSURLConnection, quindi inserire i dati nella vista Web come stringa. Ciò consentirebbe di intercettare la connessione in tutta la sua gloria e ottenere comunque il rendering nativo UIWebView. Non sono sicuro che funzionerà bene con lo streaming dei dati nella visualizzazione Web mentre arriva, ma speriamo che non stiamo parlando di troppi dati qui.

+0

Grazie. Questo è quello che sto facendo ora. –

+0

Sarei interessato a sentire, sia qui che su Twitter, come funziona, soprattutto se provi a caricare in modo incrementale la stringa HTML. –

+0

Non ho intenzione di fare il caricamento incrementale. Cercherò di blog su questo una volta che ho capito. –

Problemi correlati