[iOS] WKWebView で target=”_blank” のリンクを開く方法

2016.07.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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 号 表紙

mfd_27_1

パーツ

mfd_27_2

mfd_27_3

mfd_27_4

成果

mfd_27_5

mfd_27_6

mfd_27_7

今回の作業は以下の 3 つでした。

  • 左舷通路基部を組み立てる
  • 船体下部フレームを組み立てる
  • 組立ジグをつくる

左舷通路はエピソード 5 で、R2-D2 と C-3PO がハイパードライブの修理について口論するシーンの背景として登場していたらしいです。
「ハイパードライブはキミの手に負えないから私の足を直せ」って言っているところですね。
そのあと R2 がハイパードライブを直しちゃうんですけど。

船体下部フレームは今回でさらに 3 つのパーツを追加しました。
どんどん巨大になっていきます。

組立ジグは今後拡張していく船体を支えるものだそうです。
船体下部フレームは平らに置けなくなってきたので、今回から組立ジグに置いておきます。

mfd_27_8

それではまた次回。

May the Force be with you!