2016-10-26 4 views
0

This postおよびthis postから呼び出されたときにJavaScriptを使用してモバイルSafariでリンクを開くと、モバイルSafariでJavaScriptを使用してWKWebViewリンクを開く問題が解決されますが、WKWebView

以下のコードは、さまざまなソリューションの要素を組み込んでいますが、ボタンをクリックしてもリンクは開きません。

実際には、webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy)userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)は呼び出されません。

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) 
     } 
    } 
} 

答えて

0

問題

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

ために、SOの回答から持ち上げ時代遅れの関数定義を、使用していましたnd

webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) 

docsクラスで定義されたSwift 3関数定義を使用すると、問題が解決しました。