【发布时间】:2019-05-28 13:17:04
【问题描述】:
编辑
以下示例可以工作。我犯了一个愚蠢的错误,没有在我的网络应用程序中调用正确的页面。我将把这个留在这里,让其他寻找如何做我正在做的事情的人。
我有 Native -> WKWebView JavaScript 通信为我的项目工作,除了一件事:当我的网页加载时,我无法识别 postMessage() 调用。
我添加了一个名为“contentLoaded”的消息处理程序,我试图从我的 webview 中像这样触发它:
window.addEventListener('load', (event) => {
window.webkit.messageHandlers.contentLoaded.postMessage("content has loaded");
});
我也试过了:
window.addEventListener('DOMContentLoaded', (event) => {
window.webkit.messageHandlers.contentLoaded.postMessage("content has loaded");
});
此外,我实际上使用的是 Vue.js,所以我也尝试像这样挂钩 Vue 的 created() 和 mounted() 钩子:
mounted() {
window.webkit.messageHandlers.contentLoaded.postMessage("content has loaded");
}
或者这个:
mounted() {
window.webkit.messageHandlers.contentLoaded.postMessage("content has loaded");
}
这些都不会真正触发“contentLoaded”消息处理程序。
但是,如果我与网页进行一些交互,我可以触发消息处理程序,例如:
// This works!
button.addEventListener('click', () => {
window.webkit.messageHandlers.contentLoaded.postMessage("content has loaded");
})
我的代码的 Swift 方面如下。这里有什么建议吗?
import UIKit
import WebKit
class MainViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
super.loadView()
let contentController = WKUserContentController()
contentController.add(self, name: "contentLoaded")
let webConfiguration = WKWebViewConfiguration()
webConfiguration.userContentController = contentController
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string:"https://example.com")
var myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
}
extension MainViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("received")
if message.name == "contentLoaded", let messageBody = message.body as? String {
print(messageBody)
}
}
}
extension MainViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("didFinish navigation")
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("didStartProvisionalNavigation")
}
}
【问题讨论】:
标签: javascript swift wkwebview