如何解决使用 WebKit 进行 JavaScript 操作 - 无法将卸载消息传递给 WebKit
这是我第一次同时涉足 WebKit 和 JavaScript。我对使用 JavaScript 和 vise verse 操作 Swift 代码非常感兴趣。我的问题与 JavaScript 的响应消息和调试时在 Xcode 中打印该消息有关。下面列出的是我目前拥有的。一切正常,但是,一旦窗口在应用程序中加载,我似乎无法从 JavaScript 获取消息以进行打印。我的 info.plist 设置为处理 localhost url,所以我认为我使用的代码已贬值?我最初参考本教程 here 来获取我在下面处理的代码。
ViewController.swift
import UIKit
import WebKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let userContentController = WKUserContentController()
userContentController.add(self,name: "test")
config.userContentController = userContentController
let webView = WKWebView(frame: .zero)
view.addSubview(webView)
let layoutGuide = view.safeAreaLayoutGuide
webView.translatesAutoresizingMaskIntoConstraints = false
webView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
webView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
webView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true
if let url = URL(string: "http://localhost/WebKitExample/") {
webView.load(URLRequest(url: url))
}
}
}
extension ViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
if message.name == "test",let messageBody = message.body as? String {
print(messageBody)
}
}
}
index.php
<html>
<head>
<title>WebKitExample</title>
</head>
<body>
<h1>Hello world!</h1>
<script>
function printHelloWorld() {
window.webkit.messageHandlers.test.postMessage("Hello,world!");
}
window.onload = printHelloWorld;
</script>
</body>
</html>
有什么建议可以让这个工作正常进行吗?
谢谢!
解决方法
我解决了类似的问题
let script = WKUserScript(source: "window.print = function() { window.webkit.messageHandlers.print.postMessage('print') }",injectionTime: WKUserScriptInjectionTime.atDocumentEnd,forMainFrameOnly: true)
webView.configuration.userContentController.addUserScript(script)
webView.configuration.userContentController.add(self,name: "print")
webView.load(URLRequest(url: URL(string: link)!))
这就是我捕获消息的方式
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
if message.name == "print" {
//manage your action here
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。