2016-10-26 42 views
0

This postthis post에서 모바일 Safari의 링크를 여는 링크를 사용하여 모바일 Safari에서 WKWebView 링크를 여는 데 JavaScript를 사용하는 문제를 해결할 수 있지만 제공되는 솔루션이 작동하지 않습니다.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 함수 정의를 사용하면 문제가 해결됩니다.