Cordova AJAX请求无效

时间:2015-09-23 15:36:39

标签: ios ajax cordova cors

我使用的是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 postJIRA 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问题?感谢。

3 个答案:

答案 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 *">