WebView上のURLから画面遷移をしたい
WebViewに表示されたURLをタップして、画面遷移を行いたい。
これを読む。
概要
ユーザーが Web コンテンツをナビゲートしようとすると、Web ビューはナビゲーション デリゲートと連携して遷移を管理します。たとえば、これらのメソッドを使用して、コンテンツ内の特定のリンクからのナビゲーションを制限できます。また、リクエストの進行状況を追跡したり、エラーや認証チャレンジに応答したりするためにも使用できます。
これを読む。
概要
このメソッドを使用して、指定されたアクションから発生したナビゲーション要求を許可または拒否します。Web ビューは、インタラクションが発生した後、コンテンツをロードする前にこのメソッドを呼び出します。このメソッドを実装する場合は、必ずいずれかの時点で decisionHandler ブロックを実行します。デリゲート メソッドの実装から同期的に実行することも、メソッドが返された後に非同期的に実行することもできます。
optional func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
preferences: WKWebpagePreferences,
decisionHandler: @escaping @MainActor @Sendable (WKNavigationActionPolicy, WKWebpagePreferences) -> Void
)
WKNavigationAction
は次のスレッドで調べた。
preferences
新しい Web ページを表示するときに使用するデフォルトの設定。Web ビューを作成するときに、WKWebViewConfiguration の defaultWebpagePreferences プロパティを使用してページのデフォルトの設定を指定します。
ページ コンテンツの読み込みとレンダリング時に使用する動作を指定するオブジェクト。
表示時のレンダリング動作を変更できるのか。
decisionHandler
ナビゲーションを許可するかキャンセルするかの結果とともに呼び出す完了ハンドラー ブロック。このハンドラーには戻り値がなく、次のパラメーターを受け取ります:
・policy
ナビゲーションをキャンセルするか許可するかを示す定数。可能な値のリストについては、WKNavigationActionPolicy を参照してください。
・preferences
ナビゲーションが許可されている場合にページに適用する設定のセット。preferences パラメーターからオブジェクトを渡すか、新しい preference オブジェクトを構成して代わりに渡すことができます。
完了ハンドラーは必ず呼び出す的なこと書いてあったな。
許可するか否かと、次の表示時の動きを指定する必要があるみたい。
WKNavigationActionPolicy
case cancel
Cancel the navigation.
case allow
Allow the navigation to continue.
case download
Allow the download to proceed.
ダウンロードと遷移許可は違うみたいだ。
NavigationActionにリクエストURLが含まれているっぽい?
WKNavigationAction
ナビゲーションを発生させるアクションに関する情報を含むオブジェクト。
WKNavigationAction オブジェクトを使用して、アプリの Web ビュー内でのナビゲーションを許可するかどうかに関するポリシー決定を行います。WKNavigationAction オブジェクトは直接作成しません。代わりに、Web ビューがそれらを作成し、適切なデリゲート オブジェクトに渡します。デリゲートのメソッドを使用してアクションを分析し、結果として生じるナビゲーションを許可するかどうかを決定します。
request
Action
オブジェクトはrequest
パラメーターを持つ。
var request: URLRequest { get }
URLRequestには、urlや、httpMethod、bodyなど含まれているので便利。
このURLを解析して、指定の画面に遷移させるようにすればOKみたい。
簡単に書くとこんなになった。
URLを持ってこれているので、そのURLを解析して遷移させる。
webView.navigationDelegate = self
を忘れないようにする。
extension WebViewController: WKNavigationDelegate {
func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
) {
guard let url = navigationAction.request.url else {
decisionHandler(.cancel)
return
}
// URLパース処理
// パースできない場合、そのまま遷移
decisionHandler(.allow)
}
}