Подтвердить что ты не робот

Как отобразить вызов аутентификации в UIWebView?

Я пытаюсь получить доступ к защищенному веб-сайту через UIWebView. Когда я получаю доступ к нему через сафари, я получаю проверку подлинности, но то же самое не отображается в моем UIWebView в приложении. Как я могу сделать это?

Любые указатели, пример кода или ссылки будут очень полезными. Большое спасибо.

4b9b3361

Ответ 1

На самом деле это очень просто... Я уверен, что вы можете просто показать UIAlertView, когда показан делегат с вызовом auth (или до загрузки URL-адреса, если вы точно знаете, что URL-адрес, на который вы нажимаете, будет запрашивать auth login info). В любом случае, трюк заключается в создании вашего собственного NSURLConnection, и я делаю некоторую логику, чтобы сохранить, был ли использован делегат auth.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
{
    NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authed);

    if (!_authed) {
        _authed = NO;
        /* pretty sure i'm leaking here, leave me alone... i just happen to leak sometimes */
        [[NSURLConnection alloc] initWithRequest:request delegate:self];
        return NO;
    }

    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
{
    NSLog(@"got auth challange");

    if ([challenge previousFailureCount] == 0) {
        _authed = YES;
        /* SET YOUR credentials, i'm just hard coding them in, tweak as necessary */
        [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
{
    NSLog(@"received response via nsurlconnection");

    /** THIS IS WHERE YOU SET MAKE THE NEW REQUEST TO UIWebView, which will use the new saved auth info **/

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:]];

    [_webView loadRequest:urlRequest];
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
{
    return NO;
}

Ответ 2

как вы знаете, UIWebView не предоставляет возможности для связи с сервером. Я решил эту проблему следующим образом: в методе делегата shouldStartLoadWithRequest из UIWebView я инициировал другое соединение с NSURLConnection, и уже в методе делегата NSURLConnection didReceiveAuthenticationChallenge обработала слияние с сервером. И в методе didReceiveResponse (если вызов пришел), то снова в том же UIWebView загружается тот же URL (вызов уже обработан:). Не забудьте отменить соединение в didReceiveResponse, в противном случае он удвоит трафик.

Ответ 3

Вы также можете указать свои учетные данные в URL-адресе. Просто добавьте имя пользователя и пароль между 'http://' и 'page url'.

NSString *urlString = @"http://username:[email protected]/home";
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];

Ответ 4

если вы испытываете симптомы того, что Зак описал в комментариях Сахила:

как и y5h, добавьте `_authed = YES 'к методу didReceiveResponse, который остановит бесконечный цикл. даже если auth не был успешным, вам нужно обработать его, как если бы он был отключен, поэтому он попытается продолжить загрузку страницы, если аутентификация не требуется, если аутентификация действительно необходима, тогда она просто завершится неудачно, как обычно.

для второго симптома, где shouldStartLoadWithRequest: срабатывает несколько раз (из-за встроенного содержимого на веб-странице), и он просто покажет последнее, что загружено, а не всю веб-страницу, сделайте следующее:

в методе shouldStartLoadWithRequest: добавьте это вверху

if(webview.loading){ //if url requests come through while its loading, its probably embedded content
    return YES;
}

edit: этот метод выше имеет проблемы, если страница полностью загружается, а затем загружает больше встроенного контента впоследствии, ломается с помощью facebook, который является единственным случаем, который видел до сих пор

это позволит прокручивать URL-адреса, пока веб-сайт пытается загрузить. im не уверен, если его безопасно предположить, что каждый URL-адрес после первоначального запроса является встроенным контентом, но для моих целей он, похоже, работал, поэтому, возможно, он будет и для вас.

используйте

- (void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

потому что

connection:canAuthenticateAgainstProtectionSpace:
connection:didReciveAuthenticationChallenge:
connection:didCancelAuthenticationChallenge:

лишены, и для меня вы не можете аутентифицироваться с помощью веб-сайтов https, используя их

Ответ 5

Я хотел бы предложить другой ответ, используя следующий код: https://github.com/jivesoftware/JiveAuthenticatingHTTPProtocol

Он содержит пример, показывающий, как использовать UIAlertView, чтобы спросить пользователя о пароле и может быть легко адаптирован для возврата сохраненного пароля из локальной БД, например.

Отказ от ответственности: я никоим образом не связан с Дживом и никогда не был, это всего лишь предложение инструмента, помогавшего мне после долгих дней на этом.