WKWebViewで遷移先URLによって処理を変える(Swift5版)

以前に書いた記事「iOSアプリのWKWebViewからdeep linkがタップされたときに処理を行う」のSwift5版です。

WKWebViewで画面遷移する時のイベントを受け取るために、WKWebViewのnavigationDelegateを設定します。

なお、ソースコード中のURL「http://10.0.92.23:8000/」は開発用のWebサーバーです。

import UIKit
import WebKit

class ViewController: UIViewController {
    @IBOutlet var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.initMainWebView(self.webView)

        webView.navigationDelegate = self
        guard let url = URL(string: "http://10.0.92.23:8000/") else { return }
        self.webView.load(URLRequest(url: url))
    }
}

画面遷移するイベントを受け取ります。
遷移先のURLを確認して、URLによって処理を変えます。

URLが「my-app://〜」のときと、ホスト名が「10.0.92.23」以外のときは特別な処理を行います。

extension ViewController: WKNavigationDelegate {
    /** @abstract ナビゲーションを許可するかキャンセルするかを決定します。
     @param webView デリゲートメソッドを呼び出すWebビュー。
     @param navigationAction ナビゲーション要求をトリガーするアクションに関する説明情報。
     @param decisionHandler ナビゲーションを許可またはキャンセルするために呼び出す決定ハンドラー。
     引数は、列挙型WKNavigationActionPolicyの定数の1つです。
     @discussion このメソッドを実装しない場合、Webビューはリクエストをロードするか、必要に応じて別のアプリケーションに転送します。
     */
    @available(iOS 8.0, *)
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url {
            // my-app://〜のときは画面遷移をキャンセルして特別な処理を行う
            if url.scheme?.lowercased() == "my-app" {
                NSLog("my-app")
                decisionHandler(.cancel)
                return
            }
            // リンク先が開発サーバー外のときはブラウザで開く
            if url.host != "10.0.92.23" && UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
                decisionHandler(.cancel)
                return
            }
        }
        decisionHandler(.allow)
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください