Cordova + Bing 地图 + 内容安全策略

Posted

技术标签:

【中文标题】Cordova + Bing 地图 + 内容安全策略【英文标题】:Cordova + Bing Maps + Content Security Policy 【发布时间】:2016-02-14 13:52:13 【问题描述】:

我正在 VisualStudio 2015 中开发一个 Cordova 应用程序。 我正在尝试在其中一个页面中添加 BingMaps 模块以在地图上显示特殊位置。因此,我在 index.html 中引用了这个:

<script type="text/javascript" src="ms-appx:///Bing.Maps.JavaScript//js/veapicore.js"></script>

在我的控制器中,我使用以下命令:

Microsoft.Maps.loadModule(
  'Microsoft.Maps.Map',
  
    callback: function () /*my code here*/
  
);

当我启动应用程序时,出现此错误:

拒绝加载脚本“ms-appx:///Bing.Maps.JavaScript//js/veapicore.js”,因为它违反了以下内容安全策略指令:“default-src 'self' data :差距:https://ssl.gstatic.com'unsafe-eval'"。请注意,'script-src' 没有显式设置,因此 'default-src' 用作后备。

我的 Content-Security-Policy 是默认行,由 Cordova 插入:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

我试图更改(并删除)这一行,但没有任何结果。

如果有帮助,我正在 Ripple

中调试应用程序

【问题讨论】:

看看the Cordova Whitelist Guide 我想它会让你对你的问题有所了解。 我真诚地不能(不能让它工作。我知道这条线为我的应用程序设置了强大的安全性,但语法让我迷失了。 BingMaps 似乎需要连接到 ecn.dev.virtualearth.net。因此,我用这个:script-src 'self' http://ecn.dev.virtualearth.net 完成了 CSP,但我仍然收到这两个错误:拒绝连接到 'ecn.dev.virtualearth.net错误:无法在'上执行'打开' XMLHttpRequest': 拒绝连接到'ecn.dev.virtualearth.net(基本一样) 正在使用 angularJS 吗?我看到你说你试图把它放在你的控制器中......如果是这样,它可能与 Angular 的内置安全性有关。看看This *** Link 试过了,没有任何改变...我将 CSP 更改如下:&lt;meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"&gt; 它似乎解决了第一个问题,但我遇到了另一个错误:XMLHttpRequest无法加载 [...]。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost:4400' 不允许访问。 我没有任何 php 可以使用 header() 进行编辑,我到底应该如何设置这个域工作? 【参考方案1】:

所以我最终放弃了必应,转而使用 GoogleMaps。老实说,它在第一次尝试时就像魅力一样!这么多使用微软工具...

无论如何...

首先是在index.html中加载gogle API:

<script src="http://maps.googleapis.com/maps/api/js"></script>

然后,在控制器中,将 GoogleMaps API 添加到容器中(如果需要,还可以在中心添加一个图钉:

var tmpMap = new google.maps.Map(document.getElementById('myContainer'), 
    center: 
        lat: parseFloat($scope.lat),
        lng: parseFloat($scope.long)
    ,
    zoom: 12,
    mapTypeId: google.maps.MapTypeId.ROADMAP
);

var tmpMarker = new window.google.maps.Marker(
  position: tmpMap.getCenter(),
  map: tmpMap,
  title: 'My Title'
);

然后,设置容器的大小(与 BingMaps 不同,Google 不会调整容器的大小。因此,如果没有大小,您将看不到任何东西)

最后,将 CSP 设置为接受来自 googleapi.com/* 的代码 在这个示例中,Il 对所有内容都打开了 CSP,这在真正的应用程序上并不是一件好事:

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

瞧!

Google 就是爱,Google 就是生活 :)

【讨论】:

以上是关于Cordova + Bing 地图 + 内容安全策略的主要内容,如果未能解决你的问题,请参考以下文章

使用 bing 地图 API,我可以进行服务器端调用并获取给定城市的纬度/经度吗?

Bing Maps Geographic Coverage - Bing地图图像覆盖范围

使用 Bing 地图在 iPhone 中的方向和路线

Bing地图公共数据源

如何恢复具有地形类型(水,森林,平原..)Google / Bing地图的2D地图?

如何使用 Bing 地图检索邮政地址的纬度和经度?