Вопрос

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

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

Это было полезно?

Решение

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

- (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;
}

Другие советы

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

NSString *urlString = @"http://username:password@domain.com/home";
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];

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

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

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

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

в запросе shouldStartLoadWithRequest:метод, добавьте это в начало

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

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

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

кроме того, используйте

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

потому что

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top