我发现我可以通过file://
上的页面和使用iframe的contentWindow属性托管在远程主机上的iframe进行跨域通信。
例如在设备上我在url文件中有一个html页面://.../index.html加载了cordova并包含一个iframe:
<script type="text/javascript" src="cordova.js"></script>
<iframe id="appframe"></iframe>
在这个页面上,我可以执行一个加载iframe的javascript,并在iframed页面中保存对象的引用,如下所示:
var iframe = document.getElementById("appframe");
iframe.onload = function(){
iframe.contentWindow.cordova = window.cordova;
}
iframe.src = "http://www.example.com/appframe.html";
现在在iframe内的页面上http://www.example.com/appframe.html,我可以执行一次cordova通话,例如:
cordova.exec(null, null, "StatusBar", "hide", []);
这意外地起作用,调用StatusBar cordova插件的本机层并隐藏状态栏。
我的问题是:
这是否可以安全使用,或者是在未来版本的浏览器中无效的黑客?
我在iOS 9和Android 5设备上进行了测试。
答案 0 :(得分:0)
我认为您的config.xml中可能包含以下标记。
<access origin="*" />
如此处所述 https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/您可以将跨域策略限制为指定的域,用作属性&#34; origin&#34;的值。而不是使用通配符。
因此,如果您使用通配符值,则应该是所需的行为。
答案 1 :(得分:0)
我相信在框架之间进行通信的更安全的方式是postMessage
,如MDN中所述,以不同的方式做可能会导致设备之间的不一致(请记住,android是多么碎片化,多么痛苦可能是向后兼容4.3及以下)
因此,您可以获取iFrame元素,然后发布一个像
这样的消息 otherWindow.postMessage(InfoToSend, "*");
以同样的方式,您可以在框架内收听该事件:
window.addEventListener("message", receiveMessage, false);
这不会导致跨框架问题,它将是传递信息的更安全的方式,坏消息是您将无法通过window.cordova
实例,因此您需要建立对话在iFrame
和window.top
框架之间。