当debuggable = false时,Phonegap跨域ajax请求仅在Android上失败,而不是在debuggable = true时失败

时间:2015-04-15 17:06:39

标签: android ajax cordova rest

我有一个可以在iOS上运行良好的PhoneGap应用程序但是在设置版本时,在Android上无效。

我正在使用Phonegap CLI创建我的应用程序。

$ phonegap --version
4.2.0-0.24.2

已设置网络访问和白名单的config.xml选项:

<access origin="*" />
<feature name="http://api.phonegap.com/1.0/network" />

我已经确认我的AndroidManifest.xml正在请求互联网权限:

<uses-permission android:name="android.permission.INTERNET" />

我的API会返回相应的ACCESS-CONTROL-ALLOW-ORIGIN标头值:

Access-Control-Allow-Origin: *

为了更好的衡量,我还将其添加到我的JS:

$.support.cors = true;

如果我设置了android远程调试属性,以便我可以从chrome://inspect连接,那么网络请求就会成功,所有这些都与世界相符:

<application android:debuggable="true" ... >

但是,如果我只是删除android:debuggable="true"以便我可以提交到Play商店,重新编译并再次测试,那么我的跨域ajax请求就会失败。当他们失败时,他们会返回jqXHR.status=0jqXHR.readyState=0,根据我的经验,这表明飞行前的OPTIONS请求由于某种原因失败了。

不幸的是,当我启用调试并连接以查看网络请求时,一切正常 - 所以我看不出可能出现的问题。我已经恢复到alert()各种各样的事情,试图弄清楚发生了什么......但我没有进一步。

我还可以使用file://网址在我的笔记本电脑上的浏览器中运行我的应用程序(这是在Android应用程序中打开的方式)以及通过a local webserver运行它(在{{1在这两种情况下,跨域请求都可以正常工作。

我现在无所适从。还有什么我可以提醒以获得有关错误的更多信息吗? (也许是导致问题的其他标题?)

3 个答案:

答案 0 :(得分:1)

我相信我发现了这个问题: Android并不喜欢我的中间SSL证书。这与我所说的行为一致:< / p>

  • 适用于iOS
  • 适用于笔记本电脑上的Chrome(file://localhost
  • 在使用http://
  • 时工作正常
  • 使用statusCode=0
  • 时明显的CORS转航前请求失败(status=0https://

现在,我只是使用非SSL访问我的api所以我可以继续前进,我会让服务器管理员知道SSL有什么问题〜可能是Android不信任的中级证书。

答案 1 :(得分:1)

是的,这肯定是证书问题。

如果您想忽略证书错误并继续加载,可以执行以下操作:

yourCordovaWebView.setWebViewClient(new WebViewClient(){

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

        handler.proceed();

    }

});

但是这样做可以消除所有安全性并在中间攻击中变得容易受到攻击

您可以检查SslError以查看真正的问题

答案 2 :(得分:1)

我有同样的问题,即它在桌面浏览器或Android浏览器中工作正常,但无法通过phonegap应用程序工作。事实证明,phonegap应用程序对您必须在网络服务器中正确设置的证书链更加严格。

我将node.js用于网络服务器。所以设置它的正确方法应该是:

sslOptions = {
    key: fs.readFileSync('/CertificateFolder/privkey.pem'),
    cert: fs.readFileSync('/CertificateFolder/cert.pem'),
    ca: fs.readFileSync('/CertificateFolder/chain.pem')
},
https = require('https').Server(sslOptions, app)

这里的关键元素是&#34; chain.pem&#34;如果没有添加,该网站仍将在网络浏览器中工作,但不在phonegap应用程序中。