今までずっとできないと思い込んでいたのですが、今回実現できる方法を見つけてテンションが上がっております。
今回やろうとしているのが、WKWebView で開いているサイトにある、taget="_blank"
のリンクを開く方法です。
taget="_blank"
や window.open()
など、HTML のページを新しく開く処理は、WebView との相性が悪く、できる限り使わない方がいいと思っていたし、そういう記事も見かけたのですが…やり方があるんですね!
今回参考にさせていただいた記事はこちら。
[iOS] WKWebView で target=”_blank” のリンクを開く方法 | Developers.IO
https://dev.classmethod.jp/articles/open-target-blank-in-wkwebview/
さて、早速実装方法ですが、createWebViewWith
というメソッドを使います。
具体的には、下記の関数を、WebViewController
に追加します。
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if let url = navigationAction.request.url { // 実行したい処理 // 変数 url にはリンク先のURLが入っています } return nil }
なお、こちらの関数を使用する際には、デリゲートを設定する必要があります。
下記の処理を必ず追加してください。
webview.uiDelegate = self
そして、こちらの関数は、WebView 内で新しいページが作成される時に呼ばれます。
そのため、taget="_blank"
のリンクを開こうとした時や window.open()
の JavaScript が実行されるタイミングで発火します。
で、5行目のコメントに書いてある通り、navigationAction.request.url
にリンク先の URL が格納されているので、こちらを使えば新しく WebView を生成してページを開いたり、WebView をそのリンクで開き直したりすることが可能になります。
実際に実行する処理については、アプリの仕様に合わせてお好みで実装ください。
個人的には冒頭でも述べましたが、WebView のページで新規ウィンドウを開く処理は使用できない!と思い込んでいたので、この関数があること自体に驚きました。
コードを書きながら凄い!凄い!と言ってはしゃいでいたので、だいぶ不審者でしたね…。
使用している間に、デメリットもあるのかもしれませんが、現時点では HTML のページを改変せずに済むという方がメリットに感じているので、是非この処理を使う方向で開発を進めたいと思います。
以上 Swift の WKWebView で、表示しているページの taget="_blank"
のリンク先を開く方法でした。
ご参考になれば幸いです。