从 WKWebView 调用 swift 函数

问题描述

我正在 WKWebView 中渲染一个网页,在该网页中,我需要使用本机 swift 代码覆盖一个按钮操作。就像在网页中单击按钮导航到另一个页面一样,但在移动设备中,我需要一个显示的故事板。我没有得到任何直接链接来实现这一点。下面是我试过的代码示例:

let webConfiguration = WKWebViewConfiguration()
let userController = WKUserContentController()

    userController.add(self,name: "performClick")

    webConfiguration.userContentController = userController

    webView = WKWebView(frame: .zero,configuration: webConfiguration)

    webView.uiDelegate = self

    webView.navigationDelegate = self

    view = webView

解决方法

您可以覆盖 decidePolicyFor,它是 WKNavigationDelegate 的委托方法:

override func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if <navigationAction is the button press> {
        decisionHandler(.cancel)
         // go to the new storyboard
    } else {
        decisionHandler(.allow)
    }
}

要确定 navigationAction 是否是按钮按下,您可以检查其 request 属性,即 URLRequest。您应该知道按钮发送什么URLRequest

,

您遗漏了某些部分,要收听来自网页的消息,您还需要对网页进行一些更改。以下是从网页中监听一些动作的步骤,我的代码片段在目标 c 中,您可以转换为 swift

  1. 使用 addScriptMessageHandler 函数添加您的脚本消息,它将采用参数 WKScriptMessageHandler 和消息名称,用于测试使用消息名称,如“test”

  2. 实现 didReceiveScriptMessage 委托。

    - (void)didReceiveScriptMessage:(WKScriptMessage*)message {
         if ([message.name isEqualToString: @"test"]) {
            //Do here whatever you want.
         }
    }
    
  3. 在您的服务器页面上,只要按下该按钮,就呼叫此行。

webkit.messageHandlers.test

,

找了好久,终于找到了答案。如果这对某人有帮助,请发布此信息。

var webView: WKWebView?
var webConfig:WKWebViewConfiguration {
    get {

        let webCfg:WKWebViewConfiguration = WKWebViewConfiguration()
        let userController:WKUserContentController = WKUserContentController()
        userController.add(self,name: "submit")
        let js:String = buttonClickEventTriggered()
        let userScript:WKUserScript =  WKUserScript(source: js,injectionTime: WKUserScriptInjectionTime.atDocumentEnd,forMainFrameOnly: false)
        userController.addUserScript(userScript)
        webCfg.userContentController = userController;
        return webCfg;
    }
}
  override func viewDidLoad() {
    super.viewDidLoad()
    self.webView = WKWebView(frame: self.view.frame,configuration: webConfig)
    self.webView!.navigationDelegate = self
    self.view = webView!
    let url = URL(string:"your URL here")
    let req = NSURLRequest(url:url! as URL)
    self.webView!.load(req as URLRequest)
 }
func buttonClickEventTriggered() ->String{
    
    let script:String = "document.getElementById('your button id here').addEventListener('click',function () {window.webkit.messageHandlers.submit.postMessage('submited');});"//Make sure you have mapped the name correctly under userController.add
    return script;
}
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
    print("Sucessss")
    if(message.name == "submit") {
        print("It does ! \(message.body)")
        // Your code goes here
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...