【问题标题】:How to receive postmessage inside Facebook in-app browser?如何在 Facebook 应用内浏览器中接收邮件?
【发布时间】:2019-12-13 17:38:11
【问题描述】:

我正在尝试将邮件从打开的窗口发送到 Facebook 应用程序浏览器中的开启程序,但“开启程序窗口”从未收到消息。问题的原因可能是什么?

接收方:

window.addEventListener('message', function (e) {
    window.console.log("on message: " + e.data); 
}, false)

发送方:

window.opener.postMessage('any Message', document.location.origin);

【问题讨论】:

  • 你有没有在这方面取得任何进展?
  • 确定window === window.opener 是吗?
  • 这是一个跨域策略错误?通常,当且仅当它们源自的页面共享相同的协议、端口号和主机(也称为“同源策略”)时,不同页面上的脚本才被允许相互访问。
  • @kevzettler 不一定,iframe 的 postMessage 特别是如果它们位于不同的来源

标签: javascript facebook webview


【解决方案1】:

如果不查看更多代码,很难判断,但正如Opening facebook connect window via javascript? 答案所述,如果您尝试访问 oAuth 页面,这是不可能的。

告诉我们你从哪里获得变量 window.opener,这可能会添加一些上下文。

如果你是从window.open(/page/)打开的,看来是被特意屏蔽了:How do I get around window.opener cross-domain security 如该问题所述:

注意

社交注册不适用于 iframe 中的 google、FB 等。一世 相信他们出于安全原因不允许这样做。

同样来自window.opener is null after redirect

每当您导航到不同的主机时,window.opener 都会被删除 (出于安全原因),没有办法绕过它。唯一的选择 如果可能的话,应该在一个框架内付款。顶端 文档需要保留在同一主机上。

但是正如引用的第二个答案中提到的那样,不要在打开的页面上使用 window.opener ,而是从原始页面执行所有操作,并且(如果您可以访问弹出窗口的源),请在另一个上创建一个 onmessage页面,就像在接受的答案中提到的那样,正确的方法只是相反:

反过来做。跟踪子弹出窗口的状态 从主(开瓶器)窗口,你可以很容易地知道什么时候 子窗口已导航回您的域,因此您可以 再次与它“交谈”。但不要自行关闭子窗口。让 打开器窗口从子窗口获取结果,然后 关闭它。

参考:https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Example

例如,在您的起始页中,执行以下操作:

var popup = window.open(/*some URL*/);
popup.postMessage("hi");
addEventListener("message", function(e) {
    console.log(e);
    e.source.postMessage("Hi there"); //official workaround for window.opener on other page
})

然后在您的“/some URL/”源代码页面中,执行以下操作:

addEventListener("message", function(e) {
    console.log(e);
    e.source.postMessage("hi back");
});

并且只是玩弄该策略,但似乎 window.opener 不在图片中。试试 console.logging 它,它只是说空。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2020-06-15
    • 2015-07-05
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    相关资源
    最近更新 更多