[英]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=0
和jqXHR.readyState=0
,根据我的经验,这表明飞行前的OPTIONS请求由于某种原因而失败。
不幸的是,当我启用调试并连接以查看网络请求时,一切正常 - 所以我看不出可能出现的问题。 我已经恢复alert()
- 尝试各种各样的事情并弄清楚发生了什么......但我没有得到任何进一步的信息。
我还可以使用file://
url(在Android应用程序中打开它的方式)在我的笔记本电脑上的浏览器中运行我的应用程序,以及通过本地网络服务器 (在localhost:3030
)运行它,在这两种情况下跨域请求工作完全正常。
我现在该做什么都不知所措。 还有什么我可以提醒以获得有关错误的更多信息吗? (也许它是导致问题的其他标题?)
我相信我发现了这个问题: Android不喜欢我的中间SSL证书之一。 这与我注意到的行为一致:
file://
和localhost
) http://
时工作正常 https://
时明显的CORS飞行前请求失败( statusCode=0
, status=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.