38

UIWebViewを介して安全なWebサイトにアクセスしようとしています。サファリを介してアクセスすると、認証チャレンジが発生しますが、アプリケーションのUIWebViewに同じものが表示されません。どうすれば表示させることができますか?

ポインタ、サンプルコード、またはリンクは非常に役立ちます。どうもありがとう。

4

5 に答える 5

38

実際には非常に簡単です...認証チャレンジデリゲートが表示されたときに(または、URLをロードする前に、ヒットしているURLが認証ログイン情報を要求することが確実にわかっている場合は、UIAlertViewを表示できると確信しています) )。とにかく、トリックは独自のものを作成することで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;
}
于 2010-06-08T18:55:41.010 に答える
4

ご存知のように、UIWebView はサーバーと通信する機会を提供しません。私はこの方法でこの問題を解決しました: UIWebView のデリゲート メソッド shouldStartLoadWithRequest で、NSURLConnection との別の接続を開始し、既にデリゲート NSURLConnection のメソッドで didReceiveAuthenticationChallenge がサーバーからのチャレンジを処理しました。メソッド didReceiveResponse で (チャレンジが来た場合)、同じ UIWebView で同じ URL をロードします (チャレンジは既に処理されています:)。didReceiveResponse で接続をキャンセルすることを忘れないでください。そうしないと、トラフィックが 2 倍になります。

于 2009-12-26T17:55:25.140 に答える
1

Sahil の回答のコメントで Zach が説明した症状が発生している場合:

y5h も言ったように、`_authed = YES' を didReceiveResponse メソッドに追加すると、無限ループが停止します。認証が成功しなかった場合でも、認証されたかのように処理する必要があるため、認証が必要ない場合はページの読み込みを続行しようとします。認証が本当に必要な場合は、通常どおり失敗します。

shouldStartLoadWithRequest: が複数回発生し (Web ページに埋め込まれたコンテンツが原因で)、Web ページ全体ではなく、最後に読み込まれたものだけが表示されるという 2 番目の症状については、次のようにします。

shouldStartLoadWithRequest: メソッドで、これを一番上に追加します

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

編集: この上記の方法は、ページが完全に読み込まれ、その後さらに埋め込みコンテンツが読み込まれる場合に問題があり、これまでに見られた唯一のケースである facebook で壊れます。

これにより、Web サイトの読み込み中に URL が通過できるようになります。最初のリクエストの後のすべての URL が埋め込みコンテンツであると想定するのが安全かどうかはわかりませんが、私の目的では機能しているように見えたので、あなたにとってもそうかもしれません。

また、使用

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

なぜなら

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

私にとっては、それらを使用してhttps Webサイトで認証できませんでした

于 2013-07-18T10:13:28.780 に答える