はじめに
WKWebView
の実装をする際にWKNavigationDelegate
を使いましたが、色々できることがあるようなので、ドキュメントを読んでみました。
内容
protocol WKNavigationDelegate
ユーザがWebコンテンツを移動しようとすると、WebViewはWKNavigationDelegate
と連携して、あらゆる遷移を管理する。例えば、コンテンツ内の特定のリンクからのナビゲーションを制限することができたり、リクエストの進行状況を追跡したり、エラーや認証に対応するために使用することもできます
ナビゲーションリクエストの許可または拒否
webView(_:decidePolicyFor:preferences:decisionHandler:)
(webView(_:decidePolicyFor:decisionHandler:)
)
指定された(設定)とアクション情報に基づいて、新しいコンテンツへのナビゲーションの許可をデリゲートに要求する
optional func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
preferences: WKWebpagePreferences,
decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void
)
このメソッドを使用して、指定されたアクションを起点とするナビゲーション要求を許可または拒否する
WebViewは、インタラクションが発生した後、コンテンツをロードしようとする前に、このメソッドを呼び出す
実装する場合、必ずどこかの時点でdecisionHandler
ブロックを実行する
(webView(_:decidePolicyFor:preferences:decisionHandler:)
とwebView(_:decidePolicyFor:decisionHandler:)
はどちらかのみ)
webView(_:decidePolicyFor:decisionHandler:)
ナビゲーション要求へのレスポンスが受け取り後、新しいコンテンツへのナビゲーションの許可をデリゲートに要求する
optional func webView(
_ webView: WKWebView,
decidePolicyFor navigationResponse: WKNavigationResponse,
decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void
)
WebViewが元のURL要求に対する応答を受信した後に、ナビゲーション要求を許可または拒否する
navigationResponse
パラメータには、レスポンスが含むデータのタイプなど、レスポンスの詳細が含まれる
このメソッドを実装する場合、必ずどこかの時点でdecisionHandler
ブロックを実行する
リクエストのロード進行状況の追跡
webView(_:didStartProvisionalNavigation:)
メインフレームからのナビゲーションが開始されたときに呼ばれる
WebViewは、ナビゲーション要求を処理するための仮承認を受けた後、その要求に対する応答を受け取る前に、このメソッドを呼び出す
webView(_:didReceiveServerRedirectForProvisionalNavigation:)
WebViewが要求のサーバーリダイレクトを受信したときに呼ばれる
webView(_:didCommit:)
WebViewがメインフレームのコンテンツの受信を開始したときに呼ばれる
webView(_:decidePolicyFor:decisionHandler:)
がナビゲーションのレスポンスを承認した後、WebViewは処理を開始、変更の準備が整うと、WebViewはメインフレームを更新し始める前に、このメソッドを呼び出す
webView(_:didFinish:)
ナビゲーションが完了したときに呼ばれる
認証への対応
webView(_:didReceive:completionHandler:)
認証チャレンジに応答するようデリゲートに要求する
このメソッドを実装しない場合、WebViewはURLSession.AuthChallengeDisposition.rejectProtectionSpace
で認証チャレンジに応答します。
webView(_:authenticationChallenge:shouldAllowDeprecatedTLS:)
非推奨バージョンのTLS(Transport Layer Security)を使用する接続を続行するかどうか
これを実装しない場合、システム設定を使用して、非推奨バージョンのTLSの使用を許可するかどうかを決定する
エラーへの対応
webView(_:didFail:withError:)
ナビゲーション中にエラーが発生したときに呼ばれる
webView(_:didFailProvisionalNavigation:withError:)
プロセス開始時にエラーが発生したときに呼ばれる
webViewWebContentProcessDidTerminate(_:)
WebViewのプロセスが何らかの理由で終了したときに呼ばれる
ダウンロードの進行状況の処理
webView(_:navigationResponse:didBecome:)
ナビゲーションのレスポンスがダウンロードになったときに呼ばれる
このメソッドを実装すると、ダウンロードの進捗状況を確認することができる
webView(_:navigationAction:didBecome:)
ナビゲーションのアクションがダウンロードになったときに呼ばれる
このメソッドを実装すると、ダウンロードの進捗状況を確認することができる
おわりに
整理してみたら、やれることはそこまで多い訳ではなく、利用パターンも一般的なものが多い印象でした。
参考