【Swift】WKWebViewで表示しているページのtaget=”_blank”のリンク先を開く方法

今までずっとできないと思い込んでいたのですが、今回実現できる方法を見つけてテンションが上がっております。
今回やろうとしているのが、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" のリンク先を開く方法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG