在 Android 上处理 webkit.messageHandler postMessage

zar*_*hol 7 javascript android webkit

我试图通过事件从 web 视图执行 android 中的代码。所以我用 JavascriptInterface 实现了这个好方法,但由于我有一个 iOS 应用程序,我想使用相同的方法。那么这是否可以在 Android 上使用消息处理程序(只是一个简单的 JS 事件)而不是接口的桥接?我也尝试过另一种方式:在 iOS 上以与 Android 相同的方式构建桥梁,但它不适用于 WKWebview(但这是另一个问题)谢谢!

Tor*_*ure 4

不建议这样做,如果您可以选择更改 JS 代码并添加条件处理程序,则应该这样做。

If you have implemented a handler in iOS using userContentController and want to reuse it in Android, you can inject JS to replace the window.webkit.messageHandlers property with your android equivalent.

Say this is your swift code:

webView.configuration.userContentController.add(self, name: "iosListener")

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  //handle message
}
Run Code Online (Sandbox Code Playgroud)

And your JS code:

window.webkit.messageHandlers.iosListener.postMessage("some message")
Run Code Online (Sandbox Code Playgroud)

You can reuse it in android/kotlin without changing your JS code like this:

inner class MyJsInterface() {

    @JavascriptInterface
    fun postMessage(value: String) {
        //handle message
    }
}

webView.run {
    settings.javaScriptEnabled = true
    addJavascriptInterface(MyJsInterface(), "AndroidListener")
    webViewClient = object : WebViewClient() {
        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            super.onPageStarted(view, url, favicon)
            evaluateJavascript("window.webkit = { messageHandlers: { iosListener: window.AndroidListener} }") {}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 无论加载什么页面,都会在每个页面加载时注入并评估“window.webkit = { messageHandlers: { iosListener: window.AndroidListener} }”。在我看来,这是教科书上的“黑客”,应该避免。除非您完全控制加载的页面,否则可能会导致错误或页面损坏。您永远不知道页面是否将“window.webkit”用于其他用途。 (2认同)