2016-10-26 1 views
0

This post et this post résout le problème de l'utilisation de JavaScript pour ouvrir les liens WKWebView dans Safari mobile, mais pour une raison quelconque, les solutions fournies ne fonctionnent pas.Impossible d'utiliser JavaScript pour ouvrir des liens dans Safari mobile lorsqu'il est appelé depuis WKWebView

Le code ci-dessous incorpore des éléments de solutions différentes, mais le lien ne s'ouvre pas après avoir cliqué sur le bouton.

En fait, webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) et userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) ne sont même pas appelés.

HTML:

<html> 
    <style type="text/css"> 
     #button { width: 100px; height: 50px; background: red; } 
    </style> 

    <div id="button">CLICK TO GO</div> 

    <script type="text/javascript"> 

    var button = document.getElementById("button"); 
    button.addEventListener("click", doTest); 

    function doTest() { 
     window.open("http://www.google.com", target="_blank"); 
     button.innerHTML = "HEY"; 
    } 

    </script> 
</html> 

ViewController:

class ViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate { 

    var webView: WKWebView? 
    let webViewContentController = WKUserContentController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let config = WKWebViewConfiguration() 
     config.userContentController = webViewContentController 

     webView = WKWebView(frame: view.bounds, configuration: config) 

     webView!.navigationDelegate = self 
     webView!.uiDelegate = self //must have this 

     var fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"Mooncake.html", ofType: nil)!) 
     webView!.loadFileURL(fileURL, allowingReadAccessTo: fileURL) 

     view.addSubview(webView!) 
    } 

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
    } 

    // this handles target=_blank links by opening them in the same view 
    func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! { 
     if navigationAction.targetFrame == nil { 
      let url = navigationAction.request.url! 
      let urlString = url.description.lowercased() 

      if urlString.contains("http://") || urlString.contains("https://") || urlString.contains("mailto:") { 
       UIApplication.shared.openURL(url) 
      } 
     } 
     return nil 
    } 

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { 
     if navigationAction.targetFrame == nil { 
      webView.load(navigationAction.request) 
     } 
    } 
} 

Répondre

0

Le problème a été en utilisant des définitions de fonctions obsolètes, soulevé de la réponse affirmative, pour

webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! 

un L'utilisation des définitions de fonctions Swift 3 définies par les docs de classe a permis de résoudre le problème.