[iOS] WKWebView で target=”_blank” のリンクを開く方法
WKWebView の罠
WebKit フレームワークの WKWebView では target="_blank"
が設定されているリンクをタップしても、そのリンクが WebView 内で開かれず何も起こりません。
(UIWebView では WebView 内で開かれます)
target="_blank"
とは HTML のリンクタグの属性で、これが設定されているとそのリンクは新しいウィンドウまたはタブで開かれます。
今回は WKWebView で target="_blank"
のリンクがタップされた場合に WebView 内でそのリンクを開く方法をご紹介します。
WKUIDelegate
WKUIDelegate クラスは ウェブページの代わりにネイティブ UI の要素を表示するためのメソッドを提供します。
- webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:
このメソッドは WebView 内で新たな WebView が作成される時に呼ばれるものです。
ここで target="_blank"
のリンクがタップされたことを検知し、現在の WebView でそのページを読み込むという処理を行います。
サンプルコード
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { if (!navigationAction.targetFrame) { [webView loadRequest:navigationAction.request]; } return nil; }
リンク先の情報は引数の navigationAction
に含まれています。
target="_blank"
の場合、これが持つ targetFrame
プロパティの値が nil になります。
このメソッドはデリゲートを設定しないと呼ばれないため、忘れないようにしましょう。
webView.UIDelegate = self;
WKWebView は UIWebView と挙動が異なる点があるため、利用するときは注意しましょう。
リンク
ミレニアム・ファルコン製作日記 #27
27 号 表紙
パーツ
成果
今回の作業は以下の 3 つでした。
- 左舷通路基部を組み立てる
- 船体下部フレームを組み立てる
- 組立ジグをつくる
左舷通路はエピソード 5 で、R2-D2 と C-3PO がハイパードライブの修理について口論するシーンの背景として登場していたらしいです。
「ハイパードライブはキミの手に負えないから私の足を直せ」って言っているところですね。
そのあと R2 がハイパードライブを直しちゃうんですけど。
船体下部フレームは今回でさらに 3 つのパーツを追加しました。
どんどん巨大になっていきます。
組立ジグは今後拡張していく船体を支えるものだそうです。
船体下部フレームは平らに置けなくなってきたので、今回から組立ジグに置いておきます。
それではまた次回。
May the Force be with you!