2013-04-26 10 views
6

Widziałem, manyquestions, które pytają (i odpowiedz), jak dostarczyć poświadczenia, gdy wiesz wcześniej, że wniosek wymaga ich.Jak wykryć wyzwanie uwierzytelnienia z interfejsu UIWebView?

Kiedy załadować stronę, która żąda wyzwanie uwierzytelnienia (odpowiada HTTP 401), mój UIWebViewDelegate otrzymuje jedynie następujące wywołania zwrotne: webView:shouldStartLoadWithRequest:navigationType: i czasami webViewDidStartLoad: (webViewDidStartLoad: wydaje się być wywołana jeśli poruszać się bezpośrednio do serwisu, i to wydaje się nie być wywoływany, jeśli jestem tam przekierowany).

nadrzędnymi -[NSObject respondsToSelector:] The UIWebViewDelegate odbiera kilka telefonów do uiWebView:resource:canAuthenticateAgainstProtectionSpace:forDataSource: i uiWebView:resource:didReceiveAuthenticationChallenge:fromDataSource:, co może być przydatne, ale oczywiście te są prywatne API i prawdopodobnie się moja aplikacja odrzucona.

Przetestowałem kilka różnych aplikacji głównego nurtu z wbudowanymi UIWebView s. Jak dotąd tylko Chrome prawidłowo obsługuje te problemy z uwierzytelnianiem. Skonfigurowałem nawet własny serwer i sprawdziłem, czy Chrome jest tylko jeden raz. Twitter i Tweetbot nie wyświetlają ekranu ładowania, tak jak moje.

Czy istnieje inny (prawdopodobnie bardzo hacky) sposób na wykrycie tych wyzwań związanych z uwierzytelnianiem innych niż użycie drugiego spekulacyjnego NSURLConnection? Jeśli zgłoszę żądanie POST, wszystko będzie podwójne, co jest złe.

I've added a radar to request an enhancement to UIWebView for this. Powiel go.

+0

Dzięki za zgłoszenie radaru - oszukałem! –

Odpowiedz

6

Apple now has sample code that solves this problem. Wygląda to jak najbardziej kompletna dokumentacja, jak poprawnie wdrożyć NSURLProtocol.

+0

Mam problemy z tym przykładowym kodem. Jeden z moich NSURLConnections przestaje otrzymywać wywołania zwrotne. Jednak nadal wydaje się to najlepszą opcją. Złożyłem TSI z DTS i mam nadzieję, że Apple pomoże mi rozwiązać mój problem. –

+1

Mój problem stał się, ponieważ miałem inny 'NSURLProtocol', który użył' NSURLConnection', który przechwytywał wywołania 'UIWebView'. Po rozmowie z Apple DTS wygląda na to, że nie można używać 'NSURLProtocol' 'NSURLConnection's z' UIWebView'. Przykładowy kod Apple używa 'NSURLSession', więc wszystko jest w porządku. –

3

Można załadować wszystkie żądania we własnym numerze NSURLConnection, a następnie wprowadzić dane do widoku w postaci ciągu. Umożliwiłoby to przechwycenie połączenia w całej okazałości, a mimo to uzyskanie natywnego renderowania UIWebView. Nie jestem pewien, czy to by się dobrze sprawdziło, przesyłając dane do widoku sieci, gdy nadejdzie, ale mam nadzieję, że nie mówimy tu o zbyt dużej ilości danych.

+0

Dzięki. Właśnie to robię teraz. –

+0

Chciałbym usłyszeć, tutaj lub na Twitterze, jak to działa, szczególnie jeśli spróbujesz stopniowo ładować ciąg znaków HTML. –

+0

Nie planuję ładowania przyrostowego. Spróbuję blogować na ten temat, gdy tylko zacznę. –

Powiązane problemy