【Swift】WKWebViewでtarget="_blank"のリンクを開く方法!
この記事からわかること
- SwiftでWebサイトをiOSアプリから開く方法
- WKWebViewクラスの使い方
- target="_blank"のリンクを開くには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
WKWebViewではtarget="_blank"のリンクを開けない
SwiftのWKWebViewではデフォルトでtarget="_blank"
のリンクを開くことができない仕様になっています。リンクボタンをクリックしても何も応答しないのでこのままではユーザビリティが低下してしまいます。
WKWebViewでtarget="_blank"のリンクを開く方法
これを開けるようにするにはViewController
クラスにWKUIDelegate
を継承してtargetFrameがnilの際に再度読み込みを行わせることで解決することができます。実装は以下の通りになります。
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// target_blankの場合でも開けるようにする
if navigationAction.targetFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
WKUIDelegate
を継承させたらWKWebView
インスタンスのuiDelegate
にセットすることを忘れないようにしてください。
webView.uiDelegate = self
WKNavigationAction.targetFrameプロパティとは?
公式リファレンス:WKNavigationAction.targetFrameプロパティ
WKNavigationAction.targetFrame
プロパティはWebViewが新しいウィンドウやフレームを開こうとしている際にその新しいウィンドウやフレームが存在しない場合にnil
が格納されます。
target="_blank"
の場合は新しいウィンドウを開こうとしますが、存在しないのでnil
が格納されるので再度webView.load(navigationAction.request)
を実行することで既存のWKWebView
インスタンスでtarget="_blank"
リンクを開くことが可能になります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。