【WebKit】WKNavigationDelegateについて

# はじめに

`WKWebView`の実装をする際に`WKNavigationDelegate`を使いましたが、色々できることがあるようなので、ドキュメントを読んでみました。

https://developer.apple.com/documentation/webkit/wknavigationdelegate

# 内容

```swift
protocol WKNavigationDelegate
```

ユーザがWebコンテンツを移動しようとすると、WebViewは`WKNavigationDelegate`と連携して、あらゆる遷移を管理する。例えば、コンテンツ内の特定のリンクからのナビゲーションを制限することができたり、リクエストの進行状況を追跡したり、エラーや認証に対応するために使用することもできます

### ナビゲーションリクエストの許可または拒否

#### [`webView(_:decidePolicyFor:preferences:decisionHandler:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/3223382-webview) 
[(`webView(_:decidePolicyFor:decisionHandler:)`)](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455641-webview)
指定された(設定)とアクション情報に基づいて、新しいコンテンツへのナビゲーションの許可をデリゲートに要求する

```swift
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:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455643-webview)
ナビゲーション要求へのレスポンスが受け取り後、新しいコンテンツへのナビゲーションの許可をデリゲートに要求する

```swift
optional func webView(
    _ webView: WKWebView,
    decidePolicyFor navigationResponse: WKNavigationResponse,
    decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void
)
```

WebViewが元のURL要求に対する応答を受信した後に、ナビゲーション要求を許可または拒否する
`navigationResponse`パラメータには、レスポンスが含むデータのタイプなど、レスポンスの詳細が含まれる
このメソッドを実装する場合、必ずどこかの時点で`decisionHandler`ブロックを実行する

### リクエストのロード進行状況の追跡

#### [`webView(_:didStartProvisionalNavigation:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455621-webview) 
メインフレームからのナビゲーションが開始されたときに呼ばれる
WebViewは、ナビゲーション要求を処理するための仮承認を受けた後、その要求に対する応答を受け取る前に、このメソッドを呼び出す

#### [`webView(_:didReceiveServerRedirectForProvisionalNavigation:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455627-webview) 
WebViewが要求のサーバーリダイレクトを受信したときに呼ばれる

#### [`webView(_:didCommit:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455635-webview) 
WebViewがメインフレームのコンテンツの受信を開始したときに呼ばれる
`webView(_:decidePolicyFor:decisionHandler:)`がナビゲーションのレスポンスを承認した後、WebViewは処理を開始、変更の準備が整うと、WebViewはメインフレームを更新し始める前に、このメソッドを呼び出す

#### [`webView(_:didFinish:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455629-webview) 
ナビゲーションが完了したときに呼ばれる


### 認証への対応

#### [`webView(_:didReceive:completionHandler:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455638-webview) 
認証チャレンジに応答するようデリゲートに要求する
このメソッドを実装しない場合、WebViewは`URLSession.AuthChallengeDisposition.rejectProtectionSpace`で認証チャレンジに応答します。

#### [`webView(_:authenticationChallenge:shouldAllowDeprecatedTLS:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/3601237-webview) 
非推奨バージョンのTLS(Transport Layer Security)を使用する接続を続行するかどうか
これを実装しない場合、システム設定を使用して、非推奨バージョンのTLSの使用を許可するかどうかを決定する

### エラーへの対応

#### [`webView(_:didFail:withError:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455623-webview) 
ナビゲーション中にエラーが発生したときに呼ばれる

#### [`webView(_:didFailProvisionalNavigation:withError:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455637-webview) 
プロセス開始時にエラーが発生したときに呼ばれる

#### [`webViewWebContentProcessDidTerminate(_:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455639-webviewwebcontentprocessdidtermi) 
WebViewのプロセスが何らかの理由で終了したときに呼ばれる

### ダウンロードの進行状況の処理

#### [`webView(_:navigationResponse:didBecome:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/3727360-webview) 
ナビゲーションのレスポンスがダウンロードになったときに呼ばれる
このメソッドを実装すると、ダウンロードの進捗状況を確認することができる

#### [`webView(_:navigationAction:didBecome:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/3727359-webview) 
ナビゲーションのアクションがダウンロードになったときに呼ばれる
このメソッドを実装すると、ダウンロードの進捗状況を確認することができる

# おわりに

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

# 参考

https://developer.apple.com/documentation/webkit/wknavigationdelegate

https://qiita.com/s_emoto/items/dc3d61626155f5cf83e7