Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WKWebView target="_blank" link open new tab in safari ios11, swift 4

I understand this question has been asked a lot and I think I have viewed every single post about this and I still cannot get this to work. I'm new to swift and I think that is inhibiting me from being able to adapt code snippets from other answers.

So here's my question:

I am using a WKWebView to view a website in my app. When I click on a link that opens a new tab nothing happens. I want that new tab to open in safari or at least in a new wkwebview. I've tried implementing this answer from: https://stackoverflow.com/a/27391215, and Open a WKWebview target="_blank" link in Safari and many other similar answers, but am making no progress. What do I need to do to make this work in swift 4?

Currently I just have this since I wasn't able to implement any of the other solutions I found successfully:

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame == nil {
        webView.load(navigationAction.request)
    }
    return nil
}

But it doesn't seem to do anything. If someone could help point me in the right direction I would really appreciate it.

like image 677
dustinos3 Avatar asked Jan 03 '18 08:01

dustinos3


People also ask

Is WKWebView the same as Safari?

WKWebView - This view allows developers to embed web content in your app. You can think of WKWebView as a stripped-down version of Safari. It is responsible to load a URL request and display the web content. WKWebView has the benefit of the Nitro JavaScript engine and offers more features.

How do I use WKWebView?

Here's how: Open the XIB or Storyboard you want to add the web view to in Interface Builder. Find the web view or WKWebView in the Object Library at the bottom-left of Interface Builder. Drag-and-drop a WKWebView object from the Object Library to your view controller's canvas, and adjust its size and position.

What is WKWebView?

A WKWebView object is a platform-native view that you use to incorporate web content seamlessly into your app's UI. A web view supports a full web-browsing experience, and presents HTML, CSS, and JavaScript content alongside your app's native views.


1 Answers

I have pasted some sample code of a WKWebView project (load local html from folder) that requires links that have target=_blank to open in a new browser window.

I have highlighted the 3 things you must have to get links to open correctly.

  1. class ViewController extends WKUIDelegate
  2. self.webView.uiDelegate = self
  3. Use UIApplication.shared.open instead of webView.load

Let me know it it works and if anyone can suggest improvements to the sample code below, that would help me too :)

Full sample code for Xcode 9.2, Swift 4 below.

Good Luck

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.webView.uiDelegate = self

        let htmlPath = Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")
        let htmlUrl = URL(fileURLWithPath: htmlPath!)
        let htmlDir = Bundle.main.url(forResource: "www", withExtension: nil)
        webView.loadFileURL(htmlUrl, allowingReadAccessTo: htmlDir!)
    }

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        if navigationAction.targetFrame == nil {
            //webView.load(navigationAction.request)
            UIApplication.shared.open(navigationAction.request.url!, options: [:])
        }
        return nil
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

}
like image 186
samstride Avatar answered Nov 15 '22 17:11

samstride