Ern*_*ons 14 ajax https cordova
来自Android上的PhoneGap/Cordova应用程序的Ajax HTTPS请求莫名其妙地失败,状态= 0.它仅在使用发布密钥(即从ADT导出)对应用程序进行签名时出现,但在使用调试密钥签名(直接在模拟器或电话中运行)时不会出现.
request = new XMLHttpRequest()
request.open "GET", "https://some.domain/", true
request.onreadystatechange = ->
console.log "** state = " + request.readyState
if request.readyState is 4
console.log "** status = " + request.status
request.send()
Run Code Online (Sandbox Code Playgroud)
总是输出
** state = 4
** status = 0
Run Code Online (Sandbox Code Playgroud)
如果我从Play商店或adb实用程序安装应用程序并不重要.我认为它可以与证书连接,因为并非所有HTTPS域都以这种方式失败.
Sol*_*ran 13
我遇到了同样的问题,但我的解决方案有点不同.
仅在我的Cordova应用程序的Android App版本中,通过HTTPS调用我的服务器的AJAX被阻止.不在iOS中,不在桌面浏览器中.最令人困惑的是,在实际的Android浏览器中,HTTPS AJAX调用没有问题.
我确认我可以对众所周知且受信任的URL(例如https://google.com)进行HTTPS AJAX调用,以及对我尝试过的任何URL进行常规HTTP调用.
这让我相信我的SSL证书要么没有100%正确安装,要么PositveSSL的廉价(〜$ 10美元)证书不是普遍信任的,或两者兼而有之.
我的证书已安装在我的AWS Load Balancer上,因此我查看了我可能如何搞砸了这一点,以及PositiveSSL如何在可信度方面不是最好的证书.Lucky me发现了一篇涵盖AWS ELB安装证书的文章,他们碰巧使用的是PositiveSSL证书!包含在内的是这个小宝石:
"......不要被AWS对话框欺骗,当您的ELB直接与浏览器交谈时,证书链不是真正可选的......"
http://www.nczonline.net/blog/2012/08/15/setting-up-ssl-on-an-amazon-elastic-load-balancer/
击鼓....
我重新安装了带有"可选"证书链信息的证书,并且对我的服务器的HTTPS AJAX调用开始工作了.
因此,在证书信任方面,Android Webview似乎比Android浏览器更保守.这并不完全直观,因为它们应该基本上是相同的技术.
当请求的URL以错误或自签名证书响应时,就会发生这种情况.在测试或发布应用程序的朋友,设置<application android:debuggable="true"...>在AndroidManifest.xml是不够的-它会自动绕过证书错误.
但Google Play商店不接受带有的APK android:debuggable="true".首先,证书当然需要修复.但是当发生这种情况时,这里是PhoneGap/Cordova 3的解决方法:
在您的应用包中创建一个子类CordovaWebViewClient:
public class SSLAcceptingCordovaWebViewClient extends CordovaWebViewClient {
public SSLAcceptingCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
super(cordova, view);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)同样的IceCreamCordovaWebViewClient:
public class SSLAcceptingIceCreamCordovaWebViewClient extends IceCreamCordovaWebViewClient {
public SSLAcceptingIceCreamCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
super(cordova, view);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)在<Your App Name>.java添加替代为makeWebViewClient:
@Override
protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
return new SSLAcceptingCordovaWebViewClient(this, webView);
} else {
return new SSLAcceptingIceCreamCordovaWebViewClient(this, webView);
}
}
Run Code Online (Sandbox Code Playgroud)Etvoilà!SSL错误将被忽略.但是,永远不要使用错误的证书.尝试先修复它们,只有在用完其他解决方案时才使用这个脏的解决方法.
| 归档时间: |
|
| 查看次数: |
23881 次 |
| 最近记录: |