[android] Android WebView가 HTTPS URL을로드하지 않음

public void onCreate(Bundle savedInstance)
{
    super.onCreate(savedInstance);
    setContentView(R.layout.show_voucher);
    webView=(WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    String url ="https://www.paymeon.com/Vouchers/?v=%C80%8D%B1x%D9%CFqh%FA%84%C35%0A%1F%CE&iv=%25%EE%BEi%F4%DAT%E1"
    //webView.loadUrl(url); // Not Working... Showing blank
    webView.loadUrl("http://www.yahoo.com"); // its working
}

WebBView에서 URL을로드하려고하면 빈 화면 만 표시됩니다. Google.com 또는 yahoo.com을로드하면 정상적으로 작동합니다.



답변

이 링크를 방문하십시오 :

WebViewClient 구현에이 재정의 메서드를 추가합니다. Android SDK 2.2 (API 레벨 8) 이상으로 컴파일해야합니다. 이 메서드는 2.2 (API 레벨 8)부터 공개 SDK에 나타나지만 2.1, 1.6 및 1.5를 실행하는 장치에서 테스트했으며 해당 장치에서도 작동합니다 (따라서 동작은 모두 계속되었습니다).

 @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

이것은 당신을 도울 것입니다.


답변

다음은 도움이 될만한 작은 코드 샘플입니다.

먼저 WebViewClient를 확장하고 SSL 오류를 무시하도록 설정된 클래스를 만듭니다.

// SSL Error Tolerant Web View Client
private class SSLTolerentWebViewClient extends WebViewClient {

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed(); // Ignore SSL certificate errors
            }

}

그런 다음 웹보기 개체 (OnCreate () 메서드에서 시작됨)를 사용하여 웹보기 클라이언트를 재정의 클래스의 인스턴스로 설정합니다.

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );


답변

SSL 인증서 유효성 검사를 제대로 처리하고 새로운 보안 정책에 따라 Google의 애플리케이션 거부를 방지하려면 서버에서 제공 한 인증서가 예상을 충족 할 때마다 SslErrorHandler.proceed ()를 호출하도록 코드를 변경하고 그렇지 않으면 SslErrorHandler.cancel ()을 호출합니다.

예를 들어 사용자가 확인하고 Google이 더 이상 경고를 표시하지 않는 것처럼 보이도록 경고 대화 상자를 추가합니다.

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }
        message += " Do you want to continue anyway?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

이 변경 후에는 경고가 표시되지 않습니다.


답변

아래 코드를 제거하면 작동합니다.

 super.onReceivedSslError(view, handler, error);


답변

onReceivedSslError를 재정의하고 제거합니다.

super.onReceivedSslError (보기, 핸들러, 오류)

그리고 Google 보안을 해결하려면 :

setDomStorageEnabled (true);

전체 코드는 다음과 같습니다.

webView.enableJavaScript();
webView.getSettings().setDomStorageEnabled(true); // Add this
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DO NOT CALL SUPER METHOD
            super.onReceivedSslError(view, handler, error);
        }
    });


답변

코드 줄을 복사하여 붙여 넣으십시오. 저를 믿으십시오. 🙂 생각하고 있습니다. ssl 오류가 발생합니다. onReceivedSslError 메서드를 재정의하고 super를 제거하면 super 메서드입니다. handler.proceed () 작성하면 오류가 해결됩니다.

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            activity.setTitle("Loading...");
            activity.setProgress(progress * 100);

            if (progress == 100)
                activity.setTitle(getResources().getString(R.string.app_name));
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.d("Failure Url :" , failingUrl);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            Log.d("Ssl Error:",handler.toString() + "error:" +  error);
            handler.proceed();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl(Constant.VIRTUALPOS_URL + "token=" + Preference.getInstance(getContext()).getToken() + "&dealer=" + Preference.getInstance(getContext()).getDealerCode());


답변

SSL URL을 처리하려면 방법 WebViewClient 클래스의 onReceivedSslError () . 다음은 예제입니다.

 webview.setWebViewClient(new WebViewClient() {
              ...
              ...
              ...

            @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                String message = "SSL Certificate error.";
                switch (error.getPrimaryError()) {
                    case SslError.SSL_UNTRUSTED:
                        message = "The certificate authority is not trusted.";
                        break;
                    case SslError.SSL_EXPIRED:
                        message = "The certificate has expired.";
                        break;
                    case SslError.SSL_IDMISMATCH:
                        message = "The certificate Hostname mismatch.";
                        break;
                    case SslError.SSL_NOTYETVALID:
                        message = "The certificate is not yet valid.";
                        break;
                }
                message += "\"SSL Certificate Error\" Do you want to continue anyway?.. YES";

                handler.proceed();
            }

        });

내 전체 예제는 https://github.com/Jorgesys/Android-WebView-Logging 에서 확인할 수 있습니다.

여기에 이미지 설명 입력