InAppBrowser,打开窗口,发布消息

时间:2017-11-16 12:48:33

标签: javascript android inappbrowser postmessage

是否可以在InAppBrowser中打开一个站点,让该站点使用window.open打开另一个窗口,然后向另一个窗口发送消息(反之亦然)?

2 个答案:

答案 0 :(得分:1)

InAppBrowser对于双向通讯有一个限制:InappBrowser不允许持续通讯

解决方案1(很少有限制)

使用 IFRAME

var myIframe = document.getElementbyId(IFRAME_ID).contentWindow;

从父窗口发送msgiframe

myIframe.postmessage("Hello World", "*")

从父窗口接收msg中的iframe

window.addEventListener("message", function(e)
{
    // add your code here
});

msgiframe发送到父窗口:

window.parent.postmessage("msg from iframe", "*")

msg的父窗口中接收iframe

window.addEventListener("message", function(e)
{
    // add your code here
});

限制条件:

如果最终尝试从一个域导航到另一个域,则可能会遇到与x-frame-options相关的错误。


解决方案2(推荐)

使用 cordova-plugin-wizviewmanager:从另一个视图发送消息:

wizViewMessenger.postMessage(message_data, targetView_name);

要从另一个视图接收消息:

window.addEventListener("message", function(event)
{
    // add your code here
});

优势:

  • 直接将黑白应用程序(mainView)与其他自定义(用户创建的)视图通信。
  • 没有与x-Frame选项相关的错误

Github链接:

https://github.com/Wizcorp/cordova-plugin-wizviewmanager

答案 1 :(得分:1)

Postmessage已经在未发布的版本上实现。您可以从inAppBrowser的git页面上派生最新的开发版本:https://github.com/apache/cordova-plugin-inappbrowser/ 在构建它之前,请记住删除当前组件并添加使用它的最新开发版本。 如其文档中所述,您可以像这样发送后消息:

inAppBrowserRef.executeScript({ code: "\
            var message = 'this is the message';\
            var messageObj = {my_message: message};\
            var stringifiedMessageObj = JSON.stringify(messageObj);\
            webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj);"
        });

或者从inAppBrowser的应用程序内部,类似于:

  const message = 'message'
  const messageObj = {message: message}
  const stringifiedMessageObj = JSON.stringify(messageObj)
if (window.webkit && Window.webkit.messageHandlers) {
      console.log('postmessage call on webkit')
      window.webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj)
    }

您可以在cordova中收听它,就像:

this.inAppBrowserRef.on('message').subscribe((event) => {
      console.log(' postmessage received')
      const postObject:any = event
      if(postObject.data.message){
         console.log(postObject.data.message)
      }

    })