繁体   English   中英

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

[英]Phonegap cross-domain ajax request fails only on Android when debuggable=false, not when debuggable=true

我有一个在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:// url(在Android应用程序中打开它的方式)在我的笔记本电脑上的浏览器中运行我的应用程序,以及通过本地网络服务器 (在localhost:3030 )运行它,在这两种情况下跨域请求工作完全正常。

我现在该做什么都不知所措。 还有什么我可以提醒以获得有关错误的更多信息吗? (也许它是导致问题的其他标题?)

我相信我发现了这个问题: Android不喜欢我的中间SSL证书之一。 这与我注意到的行为一致:

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

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

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

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

yourCordovaWebView.setWebViewClient(new WebViewClient(){

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

        handler.proceed();

    }

});

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

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

我有同样的问题,即它从桌面浏览器或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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM