ralphb
ralphb

Reputation: 53

Xcode 12.5 and swift 5+ how to open external Urls links from a WKwebView?

Im trying to open external links from a IOS App with local html files. Im using Xcode 12.5 and swift 5+. The code in my ViewController is simple, just opening the index.html in a folder (www). The problem now is that i need to open external links http or https in Safari of the iPhone or the iPad and not in the local app. How can i filter that? Thanks for ideas. Here is my code so far - updated:

import UIKit
import WebKit
import PDFKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    
        
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        
        // let myURL = URL(string:"www/index.html")
        // let myRequest = URLRequest(url: myURL!)
        // webView.load(myRequest)
        
    
        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "www")!
                
        webView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        webView.load(request)
        
    
        
        
    }
    
    // WKWebViewNavigationDelegate
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
             // Check for links.
             if navigationAction.navigationType == .linkActivated {
                 // Make sure the URL is set.
                 guard let url = navigationAction.request.url else {
                     decisionHandler(.allow)
                     return
                 }
     
                 // Check for the scheme component.
                 let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
                 if components?.scheme == "http" || components?.scheme == "https" {
     
                     if navigationAction.targetFrame == nil {
                         UIApplication.shared.open(url)
                         decisionHandler(.cancel)
                     } else {
                         decisionHandler(.allow)
                     }
     
                     // Open the link in the external browser.
                     UIApplication.shared.open(url)
                     // Cancel the decisionHandler because we managed the navigationAction.
                     decisionHandler(.cancel)
                 } else {
                     decisionHandler(.allow)
                 }
             
             }
        
    }

Upvotes: 0

Views: 754

Answers (1)

gcharita
gcharita

Reputation: 8327

Apparently your webView(_:decidePolicyFor:decisionHandler:) delegate function never gets called. Check it by adding a breakpoint or a print.

To fix this, just set the navigationDelegate of your WKWebView and conform to WKNavigationDelegate:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { // <- conform to WKNavigationDelegate
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.navigationDelegate = self // <- set the navigationDelegate property
        webView.uiDelegate = self
        view = webView
    }
}

Upvotes: 1

Related Questions