web-dev-qa-db-ja.com

WKWebViewとNSURLProtocolが機能しない

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

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

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

34
Johan

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

IOS 11以降、WKURLSchemeHandlerプロトコルに準拠するオブジェクトを宣言し、WKWebView構成に登録することができます:-[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]

古い答え

WKWebViewはリクエストを作成し、コンテンツをアウトプロセスでレンダリングします。つまり、アプリはリクエストが聞こえないことを意味します。機能が不足している場合は、今がアップルにバグレポートや機能強化リクエストを開くときです。

IOS 10.3 SDKの時点では、WKWebViewはまだパブリックAPIを使用してカスタムNSURLProtocolsを使用できません。


進取の気性のある開発者が興味深い方法を見つけました: +[WKBrowsingContextController registerSchemeForCustomProtocol:] 提供されたスキームをカスタムプロトコル処理スキームのリストに追加し、NSURLProtocolで動作するはずです。

48
Leo Natan

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);
}
3
Cloud9999Strife

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

それはプライベートAPIを使用している可能性があります-私はわからない;)

1

認証のためだけにURLProtocolを使用している場合、他の方法でそれを実現できます。

UがdidFailLoadからエラーコード-1202を受け取ったときのように、URLConnectionを作成して認証を行い、その後ページをリロードします。

実際に、WKWebViewでURLProtocolも使用する必要があります、lol〜

0
ivanC