Ho scoperto che posso eseguire comunicazioni tra domini da una pagina su file://
e un iframe ospitato su un host remoto con la proprietà contentWindow dell'iframe.File cross-domain Cordova: // iframe contentwindow communication
Per esempio sul dispositivo Ho una pagina html il file url: //.../index.html che carica Cordova e contiene un iframe:
<script type="text/javascript" src="cordova.js"></script>
<iframe id="appframe"></iframe>
In questa pagina posso eseguire un javascript che carica l'iframe e salvare un riferimento di un oggetto nella pagina iframed in questo modo:
var iframe = document.getElementById("appframe");
iframe.onload = function(){
iframe.contentWindow.cordova = window.cordova;
}
iframe.src = "http://www.example.com/appframe.html";
Ora sulla pagina all'interno del iframe, http://www.example.com/appframe.html, posso eseguire una chiamata di Cordova, per esempio:
cordova.exec(null, null, "StatusBar", "hide", []);
e funziona in modo imprevisto, chiamando il livello nativo del plugin cordova StatusBar e nascondendo la barra di stato.
La mia domanda è:
È questo sicuro da usare o è un trucco che non funziona nella versione futura dei browser?
L'ho provato su dispositivi iOS 9 e Android 5.
funziona se l'appframe viene servito dal file: ///? –
Interessante. IMO è molto pericoloso farlo, se non controlli il sito remoto - quando apprendono che hai incorporato il loro codice nella tua app, possono aggiustare il loro codice e 'cordova.exec' tutto ciò che la tua app supporta tramite un plugin, e forse in combinazione con qualche altro bug, ottieni un'escalation di privilegi davvero grande.Detto questo, è necessario iniettare esplicitamente il riferimento a 'cordova' nell'iframe per farlo funzionare, quindi non è un buco di sicurezza a meno che non lo si lasci. –
@mircoc Come te, sto anche provando a caricare pagine html (la dimensione delle pagine va da 5 Mb a 100 Mb) in iframe ma molte volte l'app si blocca con errore "Memoria insufficiente". Hai affrontato questo tipo di problema? se sì, puoi guidarmi come risolvere questo? – Deepika