背景
iPhoneアプリで、WKWebViewでとあるURLを開き、何度かリダイレクトを挟んだ後に最終的にURLスキームにたどりついたときに、そのURLスキームに応じた動作をする必要がありました。しかし、URLスキームはリダイレクトしてくれなかったのでその解決方法です。
// リダイレクト時に呼ばれる関数
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)です。使い方は以下のとおり。
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を書いています。
参考になれば幸いです。