是否可以在InAppBrowser中打开一个站点,让该站点使用window.open
打开另一个窗口,然后向另一个窗口发送消息(反之亦然)?
Postmessage已经在未发布的版本上实现。您可以从他们的git页面在inAppBrowser上分叉最新的开发版本: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);"
});
或者从AppBrowser的应用程序内部来看:
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)
}
})
InAppBrowser有关于双向通信的限制:InappBrowser不允许连续通信
解决方案1(几个限制)
使用IFRAME:
var myIframe = document.getElementbyId(IFRAME_ID).contentWindow;
从父窗口发送msg
到iframe
:
myIframe.postmessage("Hello World", "*")
从父窗口接收msg
中的iframe
:
window.addEventListener("message", function(e)
{
// add your code here
});
从msg
发送iframe
到父窗口:
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
});
好处:
Github链接: