我有一个可以在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://
网址在我的笔记本电脑上的浏览器中运行我的应用程序(这是在Android应用程序中打开的方式)以及通过a local webserver运行它(在{{1在这两种情况下,跨域请求都可以正常工作。
我现在无所适从。还有什么我可以提醒以获得有关错误的更多信息吗? (也许是导致问题的其他标题?)
答案 0 :(得分:1)
我相信我发现了这个问题: Android并不喜欢我的中间SSL证书。这与我所说的行为一致:< / p>
file://
和localhost
)http://
statusCode=0
status=0
,https://
)
现在,我只是使用非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应用程序中。