小编典典

Phonegap Android应用程序对HTTPS的ajax请求失败,状态为0

ajax

来自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域都以这种方式失败。


阅读 277

收藏
2020-07-26

共1个答案

小编典典

当请求的URL响应错误或自签名证书时,就会发生这种情况。在测试或发布应用程序的朋友,设置<application android:debuggable="true"...>AndroidManifest.xml是不够的-它会自动绕过证书错误。

但是Google Play商店不接受带有的APK
android:debuggable="true"。首先,当然需要对证书进行固定。但是,在这种情况下,这是PhoneGap / Cordova
3的解决方法:

  1. 在您的应用包中,为创建一个子类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();
        }
    }
  1. 相同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();
        }
    }
  1. <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错误将被忽略。但是,切勿使用错误的证书。尝试先修复它们,然后仅在用完其他解决方案时才使用此肮脏的解决方法。

2020-07-26