Swift
WKWebView
リダイレクト
URLスキーム

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

More than 1 year has passed since last update.


背景

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を書いています。

参考になれば幸いです。