42

古い UIWebView を使用する場合、カスタム NSURLProtocol を実装することでリクエストをキャッチできます。これを使用して、認証が必要なリクエストを処理します。

同じコードを試してみましたが、新しい WKWebView では機能しませんが、プロトコル クラスはまったく呼び出されません。誰かが同じ問題を経験していますか、または WKWebView で認証を行うためのより良い方法はありますか?

何も変更しないと、decisionPolicyForNavigationResponse デリゲート関数で 401 応答が返されます。また、NSURLConnection を使用してサーバーに接続し、NSURLConnectionDataDelegate を使用して認証を処理しようとしました。それは機能しますが、保存された資格情報は WKWebView によって取得されません。

4

4 に答える 4

56

iOS 11 および macOS 10.13 の更新された回答

WKURLSchemeHandleriOS 11 以降、プロトコルに準拠するオブジェクトを宣言 し、WKWebView構成に登録することが可能になりました: -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:].

古い答え

WKWebViewリクエストを作成し、コンテンツをプロセス外でレンダリングします。つまり、アプリは作成したリクエストを認識しません。機能が不足している場合は、今こそバグ レポートや機能強化のリクエストを Apple に提出するときです。

iOS 10.3 SDK の時点では、パブリック API をWKWebView使用してカスタム を利用することはまだできません。NSURLProtocol


進取の気性に富んだ開発者は、興味深い方法を発見しました。 +[WKBrowsingContextController registerSchemeForCustomProtocol:] おそらく、提供されたスキームをカスタム プロトコル処理スキームのリストに追加し、NSURLProtocol.

于 2014-06-13T14:55:49.500 に答える
3

WKWebViewプロパティを持っていnavigationDelegateます。そのデリゲートが設定されている場合、メソッドが実装されていれば、そのデリゲートのメソッドWKWebViewが呼び出されます。didReceiveAuthenticationChallengeこのメソッドに認証コードを配置する必要があります。例:

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
    NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"bob"
                                                               password:@"pass"
                                                            persistence:NSURLCredentialPersistenceNone];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
于 2015-07-07T05:44:38.923 に答える
1

このアプローチを試してください: https://github.com/WildDylan/WKWebViewWithURLProtocol/tree/master/Example/WKWebViewWithURLProtocol

プライベートAPIを使用している可能性があります-よくわかりません;)

于 2016-12-20T08:20:40.683 に答える