如何在 ios 收到来自 javascript 的回调?
How to receive callback in ios from javascript?
我正在尝试从 wkwebview 调用 swift 中的本机函数。这是我到目前为止所做的:
Swift Part
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
contentController.add(self, name: "backHomePage")
config.userContentController = contentController
self.webView = WKWebView(frame: self.containerView.bounds, configuration: config)
webView.navigationDelegate = self
self.containerView.addSubview(self.webView)
if let url = URL(string: assessmentLink) {
webView.load(URLRequest(url: url))
}
}
And
extension WebFormVC: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("javascript sending \(message.name), body: \(message.body)")
}
}
Javascript
function backHomePage(message) {
window.webkit.messageHandlers.backHomePage.postMessage(message);
}
其中消息可以是任何字符串,例如:"success"
我目前没有在 userContentController didReceive
方法中收到回电
UPDATE
我还尝试将数据作为键值发送,例如 window.webkit.messageHandlers.backHomePage.postMessage({"message" :"Javascript to swift!"});
,还是不行。
我已尝试重现您的案例,一切似乎都按预期工作
import UIKit
import WebKit
class ViewController: UIViewController, WKScriptMessageHandler {
let content = """
<!DOCTYPE html><html><body>
<button onclick="onClick()">Click me</button>
<script>
function onClick() {
window.webkit.messageHandlers.backHomePage.postMessage("success");
}
</script>
</body></html>
"""
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
config.userContentController = WKUserContentController()
config.userContentController.add(self, name: "backHomePage")
let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 200, height: 200), configuration: config)
view.addSubview(webView)
webView.loadHTMLString(content, baseURL: nil)
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
}
}
好的,所以我的问题是对 window.webkit.messageHandlers.backHomePage.postMessage(message);
的调用在外部加载的 .js 文件中,我真的不知道为什么没有调用它。
我通过注入 javascript 函数的重载解决了这个问题,保持主体与外部 .js 文件中的主体相同,并将其注入到文档的末尾。
感谢@Andy 提出在文档中注入 userScript 的想法。如果其他人面临同样的问题但不是问题的答案,此信息可能会派上用场 "How to receive callback in ios from javascript?" 所以@Andy 的回答被接受,因为它准确地回答了问题。
我正在尝试从 wkwebview 调用 swift 中的本机函数。这是我到目前为止所做的:
Swift Part
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
contentController.add(self, name: "backHomePage")
config.userContentController = contentController
self.webView = WKWebView(frame: self.containerView.bounds, configuration: config)
webView.navigationDelegate = self
self.containerView.addSubview(self.webView)
if let url = URL(string: assessmentLink) {
webView.load(URLRequest(url: url))
}
}
And
extension WebFormVC: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("javascript sending \(message.name), body: \(message.body)")
}
}
Javascript
function backHomePage(message) {
window.webkit.messageHandlers.backHomePage.postMessage(message);
}
其中消息可以是任何字符串,例如:"success"
我目前没有在 userContentController didReceive
方法中收到回电
UPDATE
我还尝试将数据作为键值发送,例如 window.webkit.messageHandlers.backHomePage.postMessage({"message" :"Javascript to swift!"});
,还是不行。
我已尝试重现您的案例,一切似乎都按预期工作
import UIKit
import WebKit
class ViewController: UIViewController, WKScriptMessageHandler {
let content = """
<!DOCTYPE html><html><body>
<button onclick="onClick()">Click me</button>
<script>
function onClick() {
window.webkit.messageHandlers.backHomePage.postMessage("success");
}
</script>
</body></html>
"""
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
config.userContentController = WKUserContentController()
config.userContentController.add(self, name: "backHomePage")
let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 200, height: 200), configuration: config)
view.addSubview(webView)
webView.loadHTMLString(content, baseURL: nil)
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
}
}
好的,所以我的问题是对 window.webkit.messageHandlers.backHomePage.postMessage(message);
的调用在外部加载的 .js 文件中,我真的不知道为什么没有调用它。
我通过注入 javascript 函数的重载解决了这个问题,保持主体与外部 .js 文件中的主体相同,并将其注入到文档的末尾。
感谢@Andy 提出在文档中注入 userScript 的想法。如果其他人面临同样的问题但不是问题的答案,此信息可能会派上用场 "How to receive callback in ios from javascript?" 所以@Andy 的回答被接受,因为它准确地回答了问题。