页面加载时的WKWebView JavaScript通信

页面加载时的WKWebView JavaScript通信,javascript,swift,wkwebview,Javascript,Swift,Wkwebview,编辑 下面的例子确实有效。我犯了一个愚蠢的错误,没有在我的web应用程序中调用正确的页面。我会把这个留给任何想知道我在做什么的人 我的项目使用了Native->WKWebView JavaScript通信,但有一点例外:我无法在加载网页时识别postMessage调用 我添加了一个名为contentLoaded的消息处理程序,我正试图从我的webview中这样触发它: window.addEventListener('load', (event) => { window.webki

编辑

下面的例子确实有效。我犯了一个愚蠢的错误,没有在我的web应用程序中调用正确的页面。我会把这个留给任何想知道我在做什么的人

我的项目使用了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创建和安装的钩子:

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");  
})
下面是我代码的快速部分。有什么建议吗

导入UIKit 导入WebKit 类MainViewController:UIViewController、WKUIDelegate{ var-webView:WKWebView! 覆盖func加载视图{ super.loadView 让contentController=WKUserContentController contentController.addself,名称:contentLoaded 让webConfiguration=WKWebViewConfiguration webConfiguration.userContentController=contentController webView=WKWebViewframe:。零,配置:webConfiguration webView.uiDelegate=self webView.navigationDelegate=self 视图=网络视图 } 覆盖func viewDidLoad{ super.viewDidLoad 让myURL=URLstring:https://example.com var myRequest=URLRequesturl:myURL! webView.loadmyRequest } } 扩展MainViewController:WKScriptMessageHandler{ func userContentController\uusercontentcontroller:WKUserContentController,didReceive消息:WKScriptMessage{ 收到的印刷品 如果message.name==contentLoaded,则将messageBody=message.body设为?字符串{ printmessageBody } } } 扩展MainViewController:WKNavigationDelegate{ func webView_uwebview:WKWebView,didfish导航:WKNavigation{ 打印完成导航 } func webView_uwebview:WKWebView,didStartProvisionalNavigation导航:WKNavigation{ printdidStartProvisionalNavigation } } 您是否尝试过使用webView\uWebView:WKWebView,didFinish导航:WKNavigation!方法作为窗口加载时的回调,而不是javascript回调

Swift通常在WKWebView中的窗口完全加载之前不会与它通信,此时首先调用的是didFinish方法。假设您只需要知道何时加载窗口/内容,我会在JS上使用委托方法

编辑:如果在加载网页时需要从浏览器中检索某种数据,可以从返回该数据的didfish块调用Javascript方法,前提是您编写了这样的Javascript方法

public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("getData()", completionHandler: { (data, error) in
        if let data = data {
            print("Received: ", data)
        }
        if let error = error {
            print(error)
        }
    })
}

对我试图从webView触发一个JavaScript事件webView:WKWebView,didfish-navigation:WKNavigation!返回WebView,它将触发contentLoaded消息处理程序,然后将其发送回本机应用程序,但这也不起作用。我的用例是,我想将数据从webview发送到本机应用程序,以便使用它来定制一些UI。在这种情况下,我通常只需在didfish块中使用webview.evaluateJavaScript,然后调用一些Javascript方法返回我需要的数据,然后将其作为响应进行处理。浏览器中是否有您可以访问的本地内容?编辑:用上面的代码编辑了我的答案。当我尝试获取时:Error Domain=wkerrodomain code=5 JavaScript执行返回了不支持类型的结果UserInfo={NSLocalizedDescription=JavaScript执行返回了不支持类型的结果}。我的返回在JavaScript端必须是什么样子?我试图返回一个对象或字符串。Swift无法识别javascript对象。弦很好。如果您想要发送一个对象,您可以尝试将其转换为JS中的字符串并在swift中解释为对象,或者使用JSON。Swift可以将JSON转换成字典,或者用它将其解码成对象,我强烈建议您这样做,谢谢您的帮助。我的代码实际上在工作,但我有一个非常愚蠢的疏忽,没有在我的应用程序中调用正确的页面。我在我原来的帖子上加了一条便条。