javascript - 可以使用 PostMessage API 与 Android WebView 进行通信吗?

标签 javascript android android-webview postmessage

我通常使用 HTML5 PostMessage API将信息从我的 iframed 内容传达给父框架。最近,我在 Android WebView 中使用了我的内容(据我所知,这是 iframe 的原生 Android 等效项)。 native 应用程序是否可以监听我发送给它们的 PostMessage 事件?

我知道 addJavascriptInterface存在,我只是希望有一种方法可以重用我现有的 PostMessage 代码,而无需编写新的东西。

最佳答案

我意识到这个问题很老,但我遇到了它,所以我想我会在这里回答。简而言之 - 我发现 postMessage 至少对于从子 iframe 到父窗口的通信确实有效,但是......

事实证明,我们真的不喜欢 iframe 在 android 的 WebView 中的行为方式,因此我们直接渲染了 iframe 的内容(如您所建议的那样)。这给我们留下了两个问题——首先我们有很多从 iframe 到它的父级的消息 Hook ,其次我们仍然需要调用 android 来对这些事件使用react。

这是来 self 们代码的示例消息 - 散布在整个 iframe 中:

    parent.postMessage(JSON.stringify({
        action    : 'openModal',
        source    : embedId
    }), '*');

当我们使用 Android 时,我们想要使用 android's support for javascript interfaces在 WebView 中运行时注入(inject)一个对象来处理此请求。

在 Android 端,这看起来像这样:

class JsObject {
   @JavascriptInterface
    public boolean postMessage(String json, String transferList) {
        return false; // here we return true if we handled the post.
    }
}

// And when initializing the webview... 
webView.addJavascriptInterface(new JsObject(), "totDevice");

现在在这个 WebView 中运行时 totDevice 将存在,而在 iframe 中运行时则不存在。所以现在我们可以创建一个包装器来检查这种情况并在两种方法之间干净地切换,而不是直接调用 parent.postMessage。在这里,我们还在我们的 Android 实现中添加了一个 bool 开关,以防您只想处理一些消息:

function postMessage(parent, json, transferlist) {
    if (!totDevice || !totDevice.postMessage(json, transferList)) {
        parent.postMessage(json, transferlist);
    }
}

上面我们原来的postMessage可以改写:

    postMessage(parent, JSON.stringify({
        action    : 'openModal',
        source    : embedId
    }), '*');

现在我们有一组代码可以在 iframe 或 android WebView 中运行而无需更改(至少对这部分代码)。

我希望对某人有所帮助。

关于javascript - 可以使用 PostMessage API 与 Android WebView 进行通信吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164205/

相关文章:

android - 在使用 ArcGIS SDK for Android 开发的 Android 应用程序中, map 背后的网格是什么?

java - 消息为 "Connection timed out"的 ConnectionTimeoutException 和 SSLException 之间的区别

android - WebView 没有在 android 中加载 HTML5 视频

java - 在 Android 中使用 WebView 访问麦克风

android - android 中的 Webview 仅在 Samsung galaxy tab 2 中挂起

javascript - AngularJS Angular 种子启动项目添加指令

javascript - ThreeJS Android 性能

javascript - 将所有 jQuery 函数包装到一个类中

javascript - ESLint 与 Promise 一致返回错误

android - 使用包管理器禁用包与禁用 Activity 之间的区别