允许 iframe 执行 cordova 命令

Posted

技术标签:

【中文标题】允许 iframe 执行 cordova 命令【英文标题】:Allow iframe to execute cordova command 【发布时间】:2016-10-20 13:42:14 【问题描述】:

当前,我正在一个 Cordova 应用程序中嵌入在线站点;我的 config.xml 如下:

<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-navigation href="*" />

我的 index.html 有以下元标记:

<meta http-equiv="Content-Security-Policy" content="default-src *; 
style-src * 'self' 'unsafe-inline' 'unsafe-eval'; 
script-src * 'self' 'unsafe-inline' 'unsafe-eval';">

现在我需要从内部站点执行(应用程序的)codova 命令,我正在使用以下代码:

window.parent.cordova.plugins.barcodeScanner.scan(function (result) ,
function (error) );

但它(正确地)失败了:

Uncaught SecurityError: Blocked a frame with origin "http://" 访问带有源的框架 “文件://”。请求访问的帧有一个“http”协议, 正在访问的帧具有“文件”协议。协议必须匹配。

如何允许从外部网站到我的应用进行这种交互?

【问题讨论】:

【参考方案1】:

因为 CORS 和沙盒 iframe 绝对不是处理这种通信的正确方法。

在 Cordova 中有一个名为 InAppBrowser 的插件;我们可以安装它:

cordova 插件添加cordova-plugin-inappbrowser

它允许我们使用executeScript 方法通过某种消息与浏览器窗口进行交互:

var myRef = cordova.InAppBrowser.open('http://<site>', '_blank', 'location=no');

myRef.executeScript( code: "localStorage.setItem( 'demo', '' );" );

【讨论】:

以上是关于允许 iframe 执行 cordova 命令的主要内容,如果未能解决你的问题,请参考以下文章

带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie

cordova 3.4.1 iOS 命令行构建忽略有效架构?

如何在 iOS 应用中显示 iframe

Socket.io 从远程 Cordova 应用程序连接 - 不允许访问

cordova iOS blank iframe iphone iframe 白屏 ios iframe 白屏

cordova iOS blank iframe iphone iframe 白屏 ios iframe 白屏