自从使用Cordova版本6以来,使用Iframe时遇到了一些重大问题。我调用的Iframe-URL在每个浏览器中运行正常,也可以在模拟器上的cordova-app中运行。但在真实设备上,使用这个Iframe时我遇到了一个非常大的问题。
我在做什么: 通过Single API连接到Qlik Sense Server(Qlik是商业智能软件),使用如下链接:
https://my-server.com/single/?appid=bba3d39c-4570-4056-8d49-5b64405647d8&sheet=kwZkH&select=clearall&opt=debug
因为我还没有登录,我会自动路由到这个身份验证网站:
https://my-server.com:4244/form/?targetId=a0553562-06f5-4c5b-b4ba-69b6859d0cef
成功登录后,网址将返回单一API网址,并通过会话的qlikTicket进行扩展。
https://my-server.com/single/?appid=bba3d39c-4570-4056-8d49-5b64405647d8&sheet=kwZkH&select=clearall&opt=debug&qlikTicket=S_SPh6fvNkTecbz9
那么我的真正问题是什么?由于使用最新的Cordova版本6,从身份验证到原始单一URL的重定向崩溃。会话启用不到一秒钟,然后让我回到身份验证站点。
此问题仅发生在真正的Android设备上。在浏览器中使用此链接,有效。在浏览器中使用iframe,有效。在Android模拟器上试用cordova应用程序,一切正常!在真正的Android设备上试用cordova应用程序,无效!
出了什么问题? 如果在URL中持有qlikTicket有任何问题吗?因为我直接被重定向到认证站点。
我知道自Cordova 5以来有一个新的安全模型。所以我已经实现了cordova-whitelist-plugin并授予所有访问意图,导航和访问的权限,正如您在此处所见在我的 config.xml :
中 <widget id="de.inform.feliosmobile4" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>FELIOSMobile</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<icon src="res/icon.png" platform="android" width="57" height="57" density="mdpi" />
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" source="npm" spec="1.3.0" />
<allow-navigation href="*" />
<allow-intent href="*" />
<access origin="*" />
这就是我的 index.html 的样子(iframe是在代码末尾构建的):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://*/*">
<!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
<title>BeaconRanging</title>
<link rel="stylesheet" type="text/css" href="css/test.css">
<script type="text/javascript" src="jquery/jquery.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript" src="cordova.js"></script>
</head>
<body>
<!-- MONTAGE -->
<div class="popup" id="popupMONTAGE">
<center>
<div class="btnMachineGroup">Bitte Maschine wählen:</div>
<br />
<button class="btnMachineGroup" onclick="setRessource(421,'MONTAGE')">Montage Metall WA</button>
<br />
<button class="btnMachineGroup" onclick="setRessource(423,'MONTAGE')">Montage Metall AGW</button>
<br />
<button class="btnMachineGroup" onclick="setRessource(422,'MONTAGE')">Montage Metall GBK</button>
<br />
<button class="btnMachineGroup" onclick="setRessource(427,'MONTAGE')">Montage Spezialbohrkopf</button>
<br />
<button class="btnMachineGroup" onclick="setRessource(824,'MONTAGE')">Montage Service Metall</button>
<br />
<br />
<button class="btnMachineGroup" onclick="hidePopup('MONTAGE')">Schliessen</button>
</center>
</div>
<br /><br />
<div class="container">
<iframe id="qlikframe" src="https://my-server.com/single/?appid=bba3d39c-4570-4056-8d49-5b64405647d8&sheet=kwZkH&select=clearall&opt=debug"></iframe>
</div>
</body>
</html>
那么有人知道这里发生了什么,为什么?我已经联系过Qlik的支持。 Qlik方面没有问题。
... 使用cordova版本4,所有内容都运行良好,我没有没有问题。在cordova 6中构建相同的代码,应用程序无法正常运行。
您可以在Cordova-App的LOG文件中找到以下内容:
11-07 13:40:39.855 13009 13009 I chromium: [INFO:CONSOLE(44)] "TypeError: Cannot redefine property: qlikTicket
看起来,URL中的额外auth-info(qlikTicket)会丢失。如何防止这种情况?