来自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()
总是输出
** state = 4 ** status = 0
不管我是从Play商店还是通过adb实用工具安装应用程序,都没有关系。我认为它可以与证书连接,因为并非所有HTTPS域都以这种方式失败。
adb
当请求的URL响应错误或自签名证书时,就会发生这种情况。在测试或发布应用程序的朋友,设置<application android:debuggable="true"...>在AndroidManifest.xml是不够的-它会自动绕过证书错误。
<application android:debuggable="true"...>
AndroidManifest.xml
但是Google Play商店不接受带有的APK android:debuggable="true"。首先,当然需要对证书进行固定。但是,在这种情况下,这是PhoneGap / Cordova 3的解决方法:
android:debuggable="true"
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(); } }
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(); } }
<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); } }
等等! SSL错误将被忽略。但是,切勿使用错误的证书。尝试先修复它们,然后仅在用完其他解决方案时才使用此肮脏的解决方法。