javascript - InAppBrowser, Avaa ikkuna, Lähetä viesti


Onko mahdollista avata sivusto InAppBrowserissa, saada kyseinen sivusto käyttämään window.open-komentoa avatakseen toisen ikkunan, ja sitten lähettää viestiä tuohon toiseen ikkunaan (ja toisin päin)?

Vastaus #1

Postmessage on jo toteutettu julkaisemattomassa versiossa. Voit haarukoida uusimman kehitysversion inAppBrowserista heidän git-sivultaan: https://github.com/apache/cordova-plugin-inappbrowser/ Ennen rakentamista muista poistaa nykyinen komponentti ja lisätä uusin kehitysversio sen käyttämiseksi. Kuten heidän dokumentaatiossaan on kuvattu, voit lähettää postmessage-viestin seuraavasti:

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

Tai inAppBrowser-sovelluksen sisäpuolelta se on jotain tällaista:

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

Ja voit kuunnella sitä Cordovan sisällä näin:

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

    })

Vastaus #2

InAppBrowserilla on rajoitus kaksisuuntaisessa viestinnässä: InAppBrowser ei salli jatkuvaa viestintää

Ratkaisu 1 (Vähäisiä rajoituksia)

Käyttämällä IFRAME:

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

Lähetä msg iframe-elementille vanhemmasta ikkunasta:

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

Vastaanota msg iframe:ssä yläikkunasta:

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

Lähetä msg yläikkunaan iframe:stä:

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

Vastaanota msg pääikkunassa iframe:stä:

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

Rajoitus:

Jos yrität navigoida yhdeltä verkkotunnukselta toiselle lopulta, saatat saada virheen, joka liittyy x-frame-options-asetukseen.

Ratkaisu 2 (Suositeltu)

Käytä cordova-plugin-wizviewmanager: lähettääksesi viestin yhdestä näkymästä toiseen:

wizViewMessenger.postMessage(message_data, targetView_name);

Vastaanottaaksesi viestin yhdestä näkymästä toiseen:

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

Edut:

  • Suora viestintä sovelluksen (mainView) ja muiden mukautettujen (käyttäjän luomien) näkymien välillä.
  • Ei virhettä liittyen x-Frame Options -asetuksiin

Github-linkki:

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