ios - 从 WKWebView 调用时无法使用 JavaScript 在移动 Safari 中打开链接

标签 ios swift safari wkwebview wkwebviewconfiguration

This postthis post解决了在移动 Safari 中使用 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>

View Controller :

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

最佳答案

问题是使用过时的函数定义,从 SO 答案中提取,用于

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

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

使用类文档定义的 Swift 3 函数定义解决了这个问题。

关于ios - 从 WKWebView 调用时无法使用 JavaScript 在移动 Safari 中打开链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251848/

相关文章:

ios - iPod Touch 和 XCode

iphone - 在 UIViewController 上为 UIWebView 设置动画

xcode - 界面构建器中的颜色变量

ios - Swift 枚举的可用性重要吗?

javascript - 移动设备上的弹出 div 不在屏幕中间

ios - 如何确保在 xcode 4.2 中开发的应用程序将支持 ios 4 以及 ios5

ios - Xcode 在上传时卡在 "Uploading package to the App Store"阶段

ios - 应用程序扩展中的内存泄漏,UIAlertAction 附加到 UiViewController

css - wordpress wp_nav_menu 不在 safari 中显示

google-chrome - getElementsByTagName 在 chrome 和 safari 中不起作用