javascript - InAppBrowser, Otvoriť okno, Odoslať správu


Je možné otvoriť stránku v InAppBrowser, nechať túto stránku použiť window.open na otvorenie ďalšieho okna a potom poslať správu tomuto druhému oknu (a naopak)?

Odpoveď č. 1

Postmessage je už implementovaný v nereleasovanej verzii. Môžete si odchytiť najnovšiu vývojovú verziu inAppBrowser z ich git stránky: https://github.com/apache/cordova-plugin-inappbrowser/ Pred jeho zostavením nezabudnite odstrániť aktuálnu súčasť a pridať najnovšiu vývojovú verziu, aby ste ju mohli používať. Ako je popísané v ich dokumentácii, môžete odoslať postmessage takto:

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

Alebo zvnútra aplikácie inAppBrowser to je niečo ako:

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

A môžete to počúvať vo vnútri Cordovy takto:

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

    })

Odpoveď č. 2

InAppBrowser má obmedzenie týkajúce sa obojsmernej komunikácie: InAppBrowser neumožňuje kontinuálnu komunikáciu

Riešenie 1 (malo obmedzení)

Používanie IFRAME:

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

Odoslať msg do iframe z rodičovského okna:

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

Prijmite msg v iframe od rodičovského okna:

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

Odoslať msg do rodičovského okna z iframe:

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

Prijmite msg v nadradenej okne z iframe:

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

Obmedzenie:

Ak sa pokúsite presunúť z jednej domény na druhú, nakoniec sa vám môže zobraziť chyba súvisiaca s x-frame-options.

Riešenie 2 (Odporúčané)

Použite cordova-plugin-wizviewmanager: na odoslanie správy z jedného zobrazenia do druhého:

wizViewMessenger.postMessage(message_data, targetView_name);

Na prijatie správy z jedného pohľadu do druhého:

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

Výhody:

  • Priamo komunikovať medzi aplikáciou (mainView) a iným vlastným (vytvoreným používateľom) zobrazením.
  • Žiadna chyba súvisiaca s možnosťami x-Frame

Odkaz na Github:

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