以前に書いた記事「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)
}
}