1
2

More than 1 year has passed since last update.

【WebKit】WKNavigationDelegateについて

Posted at

はじめに

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:)

ナビゲーションのアクションがダウンロードになったときに呼ばれる
このメソッドを実装すると、ダウンロードの進捗状況を確認することができる

おわりに

整理してみたら、やれることはそこまで多い訳ではなく、利用パターンも一般的なものが多い印象でした。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2