问题描述
我正在 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
-
使用
addScriptMessageHandler
函数添加您的脚本消息,它将采用参数WKScriptMessageHandler
和消息名称,用于测试使用消息名称,如“test” -
实现
didReceiveScriptMessage
委托。- (void)didReceiveScriptMessage:(WKScriptMessage*)message { if ([message.name isEqualToString: @"test"]) { //Do here whatever you want. } }
-
在您的服务器页面上,只要按下该按钮,就呼叫此行。
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
}
}