LoginSignup
30
27

More than 5 years have passed since last update.

【Swift】WKWebViewのリダイレクト先URL(URLスキーム)に応じて動作したい時にハマったこと

Posted at

背景

iPhoneアプリで、WKWebViewでとあるURLを開き、何度かリダイレクトを挟んだ後に最終的にURLスキームにたどりついたときに、そのURLスキームに応じた動作をする必要がありました。しかし、URLスキームはリダイレクトしてくれなかったのでその解決方法です。

ViewController.swift
// リダイレクト時に呼ばれる関数
func webView(webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
        if let url = webView.URL?.absoluteString {
            // ここでURLに応じた処理を書く
        }
}

解決方法

didReceiveServerRedirectForProvisionalNavigationはデフォルトでは、http~とhttps~のみをリダイレクト対象として呼び出されるようでした。どのURLをリダイレクトとして扱うかのハンドリングをしている関数が、func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void)です。使い方は以下のとおり。

ViewController.swift
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.URL?.absoluteString{
            if(url.hasPrefix("URLスキーム")){//この部分を処理したいURLにする
                // リダイレクトとして扱う
                decisionHandler(WKNavigationActionPolicy.Allow)
            }else if(url.hasPrefix("http")){
                decisionHandler(WKNavigationActionPolicy.Allow)
            }else{
                // リダイレクトとして扱わない
                decisionHandler(WKNavigationActionPolicy.Cancel)
            }
        }
}

この関数内でハンドリングを行うのですが、特定のURLリクエストに対して、Allowしてあげるとリダイレクトとして扱われ、didReceiveServerRedirectForProvisionalNavigationが呼び出されます。特定のURLやhttp~以外を弾きたかったので、今回はelseにCancelを書いています。

参考になれば幸いです。

30
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
27