This post 및 this 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)
}
}
}