Swift実践ブログ

ド文系アラサー社会人が独学でプログラミングを学ぶ記録

【Swift】WKWebViewでリンク先が開けない場合の対処法(ATS/target=”_blank”)

■はじめに

【Swift】WKWebViewでhttpsのページを表示できない原因(ATS) - Swift実践ブログでは、httpsのページに遷移できない現象について取り上げましたが、今回はリンク先が開けない現象に関してまとめたいと思います。

 

■開発環境

Xcode 9.4.1

・Swift 4.1.2

 

■現象

リンク先をタップしても開けない(画面が白くなるわけでもなく、全く反応しない)

※該当ページはSafariの場合、リンク先をタップすると新しいタブにリンク先が表示される。

 

■検証

1.ATS設定が怪しい

AllowsArbitraryLoadsをYESに変更してもリンク先は開けない。

 

2.「target=”_blank”」が怪しい

以下記事から、開けないリンクのソースを確認したところ「target=”_blank”」が見事に設定されていました。しかし、「target=”_blank”」が設定されたリンクでも、必ずしも新しいタブが開くとは限らず、タブが開かないリンクは遷移できる状況でした。また、記事に掲載されている実装方法を参考にしても解決できず。

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

WKWebViewでtarget="_blank"なリンクが開かない時の対処法

 

■解決

新しいWebビューを作成するインスタンスメソッド「webView(_:createWebViewWith:for:windowFeatures:)」を使うことは検証2と同じものの、以下記事に掲載されている実装方法を参考にして解決しました。

【Swift4】WKWebViewのミニマムサンプル【iOS】

 

■実装部分

import UIKit
import WebKit

class ViewController: UIViewController {
    
    var webView: WKWebView!
    
   // Viewを作成する
    override func loadView() {
        super.loadView()
        let viewConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: viewConfiguration)
  self.view = webView
        webView.uiDelegate = self
    }
    
   // Webページを読み込む
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string: "{表示したいURL}")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

// (Safariでは新しいタブがひらく)リンク先を開けるようにする
extension ViewController: WKUIDelegate {
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        if navigationAction.targetFrame == nil {
            webView.load(navigationAction.request)
        }
        return nil
    }
}

  

■おわりに

リンク先をタップしても何も反応がない状況から、原因を特定して実装し解決するまでかなり時間がかかってしまいました。表題のテーマでは多くの記事がありますが、本記事が少しでも参考になればと思います。

 

■関連リンク

WKWebView - WebKit | Apple Developer Documentation

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

WKWebViewでtarget="_blank"なリンクが開かない時の対処法

webView(_:createWebViewWith:for:windowFeatures:) - WKUIDelegate | Apple Developer Documentation

【Swift4】WKWebViewのミニマムサンプル【iOS】