我使用的是Cordova 5.3.1,而且我似乎完全无法在没有错误的情况下发出任何网络请求。如果我添加
$.ajax( "http://foo.bar.com/getfeed" )
.done(function() {
alert( "success" );
})
.fail(function(jqXHR, textStatus, errorThrown) {
alert( errorThrown );
})
.always(function() {
alert( "complete" );
});
到index.js
它失败并在iOS和Error: SecurityError: DOM Exception 18
中提醒SecurityError: Failed to execute 'open on 'XMLHttpRequest': Refused to connect to 'http://foo.bar.com/getfeed' because it violates the document's Content Security Policy.
,因此看起来CORS正在被阻止。
目前whitelist plugin按照此SO post和JIRA issue安装ducumentation时无法正常安装,基本上它需要iOS平台>=4.0.0-dev
。我仍然可以强制它安装旧版本:
cordova plugin add cordova-plugin-whitelist@1.0.0
根据SO帖子和JIRA问题中的建议。
但是我仍然无法向外部域发出任何http请求。我仍然得到相同的' DOM Exception 18'错误。我的config.xml
文件目前是
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.company.pearstest" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>CORS test</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" version="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:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
</widget>
允许不同来源的标签最近似乎已经在不同的版本中发生了变化,因此我尝试了该文件中各种不同标签的可能组合。
我还检查了$.support.cors
以确保jQuery允许CORS并且它确实(jQuery正常工作,因为AJAX请求正在运行失败回调而不是默默地失败)。
我也有元标记
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">
index.html
中的。我怀疑这不是我的模拟器阻止http请求的问题,因为它在Android和iOS模拟器以及Android设备上都存在问题。
有没有人知道为什么我仍然有CORS问题?感谢。
答案 0 :(得分:6)
您是否尝试过将Content-Security-Policy配置为:
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
注意默认-src中的*并使用; - 我还在上面的示例中包含了一些其他指令,以允许常见的JS库工作......这是我在为Android和iOS构建的JQuery / Handlebars Cordova 5应用程序中使用的。
答案 1 :(得分:2)
对于iOS,如果您正在为iOS9构建并且希望能够命中不安全的端点,则必须编辑plist文件。 This gist有说明。
我个人仍然遇到Cordova 5.3.1和Android跨域ajax请求的问题。这些东西在旧版Cordova上运行良好。
[编辑] Android 需要白名单插件,以便ajax请求正常工作。 Janky IMO,但很高兴让ajax再次在android上工作。
答案 2 :(得分:1)
什么对我有用:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src *">