InAppBrowser,打开窗口,发布消息

mic*_*cah 5 javascript android postmessage inappbrowser

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

小智 7

Postmessage 已经在未发布的版本上实现。你可以从他们的 git 页面在 inAppBrowser 上 fork 最新的开发版本:https : //github.com/apache/cordova-plugin-inappbrowser/ 在构建它之前记得删除当前组件并添加最新的开发版本以使用它. 正如他们在他们的文档中所描述的,你可以发送 postmessage,如:

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);"
        });
Run Code Online (Sandbox Code Playgroud)

或者从 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)
    }
Run Code Online (Sandbox Code Playgroud)

你可以在cordova里面听它,比如:

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

    })
Run Code Online (Sandbox Code Playgroud)


小智 1

InAppBrowser 在双向通信方面存在限制:InappBrowser 不允许连续通信

解决方案 1(一些限制)

使用IFRAME

var myIframe = document.getElementbyId(IFRAME_ID).contentWindow;
Run Code Online (Sandbox Code Playgroud)

从父窗口发送msg到:iframe

myIframe.postmessage("Hello World", "*")
Run Code Online (Sandbox Code Playgroud)

msgiframe父窗口接收:

window.addEventListener("message", function(e)
{
    // add your code here
});
Run Code Online (Sandbox Code Playgroud)

发送msg到父窗口iframe

window.parent.postmessage("msg from iframe", "*")
Run Code Online (Sandbox Code Playgroud)

msg在父窗口中接收来自iframe

window.addEventListener("message", function(e)
{
    // add your code here
});
Run Code Online (Sandbox Code Playgroud)

局限性:

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


方案2(推荐)

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

wizViewMessenger.postMessage(message_data, targetView_name);
Run Code Online (Sandbox Code Playgroud)

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

window.addEventListener("message", function(event)
{
    // add your code here
});
Run Code Online (Sandbox Code Playgroud)

优点:

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

GitHub 链接:

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