Open a WKWebview target=“_blank” link in Safari

后端 未结 5 1259
执念已碎
执念已碎 2020-12-10 15:04

I am trying to get my Hybrid IOS app that uses Swift and WKWebviews to open a link that has target=\"_blank\" or if the URL contains http://,

相关标签:
5条回答
  • 2020-12-10 15:32

    In (from here)

     override func loadView() {
        super.loadView()
        self.webView.navigationDelegate = self 
        self.webView.UIDelegate = self  //must have this
     }
    

    Then add the function (from here, with additions)...

    func webView(webView: WKWebView,
        createWebViewWithConfiguration configuration: WKWebViewConfiguration,
        forNavigationAction navigationAction: WKNavigationAction,
        windowFeatures: WKWindowFeatures) -> WKWebView? {
            if navigationAction.targetFrame == nil {
                var url = navigationAction.request.URL
                if url.description.lowercaseString.rangeOfString("http://") != nil || url.description.lowercaseString.rangeOfString("https://") != nil || url.description.lowercaseString.rangeOfString("mailto:") != nil  {
                    UIApplication.sharedApplication().openURL(url)
                }
            }
            return nil
    }
    
    0 讨论(0)
  • 2020-12-10 15:33

    Swift 4.2

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
        if navigationAction.navigationType == WKNavigationType.linkActivated {
            print("here link Activated!!!")
            if let url = navigationAction.request.url {
                let shared = UIApplication.shared
                if shared.canOpenURL(url) {
                    shared.open(url, options: [:], completionHandler: nil)
                }
            }
            decisionHandler(.cancel)
        }
        else {
            decisionHandler(.allow)
        }
    }
    
    0 讨论(0)
  • 2020-12-10 15:39

    First add WKNavigationDelegate and webviewWk.navigationDelegate = self

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    
            //this is a 'new window action' (aka target="_blank") > open this URL externally. If we´re doing nothing here, WKWebView will also just do nothing. Maybe this will change in a later stage of the iOS 8 Beta
            if navigationAction.navigationType == WKNavigationType.LinkActivated {
                println("here link Activated!!!")
                let url = navigationAction.request.URL
                let shared = UIApplication.sharedApplication()
    
                let urlString = url!.absoluteString
    
                if shared.canOpenURL(url!) {
                    shared.openURL(url!)
                }
    
                decisionHandler(WKNavigationActionPolicy.Cancel)
            }
    
            decisionHandler(WKNavigationActionPolicy.Allow)
        }
    
    0 讨论(0)
  • 2020-12-10 15:42

    Code updated for iOS 10 Swift 3:

    override func loadView() {
        super.loadView()
        self.webView.navigationDelegate = self 
        self.webView.uiDelegate = self  //must have this
    }
    
    func webView(_ webView: WKWebView,
                   createWebViewWith configuration: WKWebViewConfiguration,
                   for navigationAction: WKNavigationAction,
                   windowFeatures: WKWindowFeatures) -> WKWebView? {
        if navigationAction.targetFrame == nil, let url = navigationAction.request.url {
          if url.description.lowercased().range(of: "http://") != nil ||
            url.description.lowercased().range(of: "https://") != nil ||
            url.description.lowercased().range(of: "mailto:") != nil {
            UIApplication.shared.openURL(url)
          }
        }
      return nil
    }
    
    0 讨论(0)
  • 2020-12-10 15:49
    func webView(_ webView: WKWebView,
               createWebViewWith configuration: WKWebViewConfiguration,
               for navigationAction: WKNavigationAction,
               windowFeatures: WKWindowFeatures) -> WKWebView? {
      if navigationAction.targetFrame == nil, let url = navigationAction.request.url, let scheme = url.scheme {
        if ["http", "https", "mailto"].contains(where: { $0.caseInsensitiveCompare(scheme) == .orderedSame }) {
          UIApplication.shared.openURL(url)
        }
      }
      return nil
    }
    
    0 讨论(0)
提交回复
热议问题