Кордовы междоменного файла: // iframe contentwindow communication

Я обнаружил , что я могу сделать междоменную связь со страницы на file://и <скрипт типа = "текст / JavaScript" SRC = "cordova.js" > </ SCRIPT> <IFRAME ID = "appframe" > </ IFRAME> размещенный на удаленном хосте с свойством contentWindow iframe.

Например, на устройстве у меня есть html-страница в файле url: //.../index.html, которая загружает кордову и содержит iframe:

var iframe = document.getElementById("appframe");
iframe.onload = function(){
    iframe.contentWindow.cordova = window.cordova;
}
iframe.src = "http://www.example.com/appframe.html";

На этой странице я могу выполнить javascript, который загружает iframe и сохраняет ссылку на объект на iframed странице следующим образом:

cordova.exec(null, null, "StatusBar", "hide", []);

Теперь на странице внутри iframe, http://www.example.com/appframe.html , я могу выполнить вызов cordova, например:

<access origin="*" />

и это неожиданно работает, вызывая собственный слой плагина StatusBar cordova и скрывая строку состояния.

Мой вопрос:

Безопасно ли это использовать или является хаком, который не будет работать в будущей версии браузеров?

Я тестировал его на устройствах iOS 9 и Android 5.

javascript,cordova,iframe,cross-domain,

12

Ответов: 2


0

Я думаю, что, возможно, у вас в вашем файле config.xml следующий тег.

postMessage

как описано здесь https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/, вы можете ограничить перекрестную политику домена указанными доменами, используемыми как значение свойства «origin», вместо использования подстановочного знака.

Поэтому, если вы используете значение подстановочного знака, это должно быть желаемое поведение.


0

Я верю, что более безопасный способ связи между кадрами otherWindow.postMessage(InfoToSend, "*");описан в MDN , но это по-другому может вызвать несогласованность между устройствами (помните, как фрагментирован андроид и насколько болезненным может быть обратная совместимость с 4.3 и ниже)

Таким образом, вы можете получить элемент iFrame, а затем опубликовать сообщение в формате msg

window.addEventListener("message", receiveMessage, false);

Точно так же вы можете прослушать это событие внутри фрейма:

window.cordova

Это не вызовет проблем с межкадровыми кадрами, и это будет более безопасный способ передачи информации, плохая новость в том, что вы не сможете передать iFrameэкземпляр, поэтому вам нужно будет установить разговор между кадром iFrameи window.topкадром.

JavaScript, Cordova, IFrame, кросс-домен,
Похожие вопросы