Closed6

WebView上のURLから画面遷移をしたい

ほへとほへと

WebViewに表示されたURLをタップして、画面遷移を行いたい。

ほへとほへと

これを読む。

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


概要

ユーザーが Web コンテンツをナビゲートしようとすると、Web ビューはナビゲーション デリゲートと連携して遷移を管理します。たとえば、これらのメソッドを使用して、コンテンツ内の特定のリンクからのナビゲーションを制限できます。また、リクエストの進行状況を追跡したり、エラーや認証チャレンジに応答したりするためにも使用できます。

ほへとほへと

これを読む。

https://developer.apple.com/documentation/webkit/wknavigationdelegate/3223382-webview


概要

このメソッドを使用して、指定されたアクションから発生したナビゲーション要求を許可または拒否します。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 プロパティを使用してページのデフォルトの設定を指定します。

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

ページ コンテンツの読み込みとレンダリング時に使用する動作を指定するオブジェクト。

表示時のレンダリング動作を変更できるのか。

decisionHandler

ナビゲーションを許可するかキャンセルするかの結果とともに呼び出す完了ハンドラー ブロック。このハンドラーには戻り値がなく、次のパラメーターを受け取ります:
・policy
ナビゲーションをキャンセルするか許可するかを示す定数。可能な値のリストについては、WKNavigationActionPolicy を参照してください。
・preferences
ナビゲーションが許可されている場合にページに適用する設定のセット。preferences パラメーターからオブジェクトを渡すか、新しい preference オブジェクトを構成して代わりに渡すことができます。

完了ハンドラーは必ず呼び出す的なこと書いてあったな。
許可するか否かと、次の表示時の動きを指定する必要があるみたい。

WKNavigationActionPolicy

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

case cancel
    Cancel the navigation.
case allow
    Allow the navigation to continue.
case download
    Allow the download to proceed.

ダウンロードと遷移許可は違うみたいだ。

ほへとほへと

NavigationActionにリクエストURLが含まれているっぽい?

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


WKNavigationAction

ナビゲーションを発生させるアクションに関する情報を含むオブジェクト。
WKNavigationAction オブジェクトを使用して、アプリの Web ビュー内でのナビゲーションを許可するかどうかに関するポリシー決定を行います。WKNavigationAction オブジェクトは直接作成しません。代わりに、Web ビューがそれらを作成し、適切なデリゲート オブジェクトに渡します。デリゲートのメソッドを使用してアクションを分析し、結果として生じるナビゲーションを許可するかどうかを決定します。

request

Actionオブジェクトはrequestパラメーターを持つ。

https://developer.apple.com/documentation/webkit/wknavigationaction/1401910-request

var request: URLRequest { get }

URLRequestには、urlや、httpMethod、bodyなど含まれているので便利。

https://developer.apple.com/documentation/foundation/urlrequest

ほへとほへと

簡単に書くとこんなになった。
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)
    }
}
このスクラップは4ヶ月前にクローズされました