古いUIWebViewを使用している場合、カスタムNSURLProtocolを実装することでリクエストをキャッチできます。認証を必要とするリクエストを処理するためにこれを使用します。
同じコードを試してみましたが、新しいWKWebViewでは動作しませんが、プロトコルクラスはまったく呼び出されません。誰かが同じ問題を経験していますか、それともWKWebViewで認証を行うより良い方法がありますか?
変更なしで、decidePolicyForNavigationResponseデリゲート関数で401応答を取得します。 NSURLConnectionを使用してサーバーに接続し、NSURLConnectionDataDelegateを使用して認証を処理することも試みました。これは機能しますが、保存された資格情報はWKWebViewによって取得されません。
IOS 11以降、WKURLSchemeHandler
プロトコルに準拠するオブジェクトを宣言し、WKWebView
構成に登録することができます:-[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]
。
WKWebView
はリクエストを作成し、コンテンツをアウトプロセスでレンダリングします。つまり、アプリはリクエストが聞こえないことを意味します。機能が不足している場合は、今がアップルにバグレポートや機能強化リクエストを開くときです。
IOS 10.3 SDKの時点では、WKWebView
はまだパブリックAPIを使用してカスタムNSURLProtocol
sを使用できません。
進取の気性のある開発者が興味深い方法を見つけました: +[WKBrowsingContextController registerSchemeForCustomProtocol:]
提供されたスキームをカスタムプロトコル処理スキームのリストに追加し、NSURLProtocol
で動作するはずです。
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);
}
このアプローチを試してください: https://github.com/WildDylan/WKWebViewWithURLProtocol/tree/master/Example/WKWebViewWithURLProtocol
それはプライベートAPIを使用している可能性があります-私はわからない;)
認証のためだけにURLProtocolを使用している場合、他の方法でそれを実現できます。
UがdidFailLoadからエラーコード-1202を受け取ったときのように、URLConnectionを作成して認証を行い、その後ページをリロードします。
実際に、WKWebViewでURLProtocolも使用する必要があります、lol〜