在Android上处理webkit.messageHandler postMessage

时间:2016-09-28 10:03:01

标签: javascript android webkit

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

1 个答案:

答案 0 :(得分:1)

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

如果您已经使用 userContentController 在 iOS 中实现了处理程序并希望在 Android 中重用它,您可以注入 JS 以将 window.webkit.messageHandlers 属性替换为您的 android 等效项。

说这是您的 swift 代码:

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

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  //handle message
}

还有你的 JS 代码:

window.webkit.messageHandlers.iosListener.postMessage("some message")

您可以在 android/kotlin 中重用它,而无需像这样更改您的 JS 代码:

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} }") {}
        }
    }
}