Загрузка определенного веб-приложения HTTPS в веб-просмотр Android

Я пытаюсь загрузить веб-приложение https://waveswallet.io, которое представляет собой приложение кошелька с блокчейном в веб-просмотре Android, все мои попытки провалились.

Я пробовал все различные методы, упомянутые в стеке для https-сайтов, но приложение отказывается загружаться в веб-просмотре, хотя отлично работает с любым браузером Chrome или Firefox.

вот код, который я использовал до сих пор.

mWebView =(WebView)findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
mWebView.loadUrl("https://waveswallet.io");
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());

person Marcos DaSilva    schedule 25.01.2018    source источник
comment
Пожалуйста, добавьте, какой код вы уже написали   -  person Napster    schedule 25.01.2018


Ответы (3)


Используйте приведенный ниже код для WebViewClient и обработайте метод onReceivedSslError:

mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error){
                final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
                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;
                    case SslError.SSL_DATE_INVALID:
                        message = "The date of the certificate is invalid.";
                        break;
                    case SslError.SSL_INVALID:
                        message = "A generic error occurred.";
                        break;
                    case SslError.SSL_MAX_ERROR:
                        message = "Unknown error occurred.";
                        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();
            }
        });

И переместите эту строку в последнюю строку кода и после кода выше:

mWebView.loadUrl("https://waveswallet.io");

ОБНОВЛЕН ПОЛНЫЙ КОД:

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    CookieManager.getInstance().setAcceptCookie(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // If Android 6.0+ i must add support for Third Party Cookies
            CookieManager.getInstance().setAcceptThirdPartyCookies(sourceWebView, true);
        }
        mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
      mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
        //mWebView.getSettings().setPluginsEnabled(true);
        mWebView.getSettings().setSupportMultipleWindows(false);
        mWebView.getSettings().setSupportZoom(true);
        mWebView.setVerticalScrollBarEnabled(true);
        mWebView.setHorizontalScrollBarEnabled(true);
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setUserAgentString("Android WebView");
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(this, "Android");// add this only if required. Vulnerable to mitm attacks.
        mWebView.getSettings().setLoadsImagesAutomatically(true);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.setWebViewClient(new WebViewClient());// use as above to handle ssl errors
        mWebView.loadUrl("https://waveswallet.io");

ВЫВОДИТЕ СКРИНШОТЫ

Устройство 1 — Moto E3 Power [Android Marshmallow 6.0, уровень API 23]

Moto E3 Power

Устройство 2 — Samsung Galaxy S8 [Android Nougat 7.0, уровень API 24]

Самсунг Галакси С8

Устройство 3 — One Plus Five [Android Oreo 8.0.0, уровень API 26]

Один плюс пять

Я надеюсь, что это решит вашу проблему. Поскольку это проблема с вашим SSL-сертификатом на веб-сайте.

person Amrut Bidri    schedule 25.01.2018
comment
действительно странно, я пробую точный код на 3 устройствах (SDK 19, SDK 24), эмуляторах и реальных устройствах, но не работает, вот полный код простого приложения. pastebin.com/mfR0X02h - person Marcos DaSilva; 25.01.2018
comment
какую версию андроида вы используете? - person Marcos DaSilva; 25.01.2018
comment
Пожалуйста, смотрите мой обновленный ответ. Я добавил 2 строки в начале. - person Amrut Bidri; 25.01.2018
comment
Спасибо за вашу помощь, но все еще не работает, интересно, какую версию вы используете? - person Marcos DaSilva; 26.01.2018

ты можешь попробовать это

 try {
        if (CommonUtils.isConnectingToInternet(HelpWebviewActivity.this)) {
        //check internet connection

            WebSettings webSettings = webview_help.getSettings();
            webview_help.setWebViewClient(new MyWebViewClient());
            webSettings.setJavaScriptEnabled(true);
            webview_help.getSettings().setSupportZoom(true);
            webview_help.getSettings().setBuiltInZoomControls(true);
            webview_help.getSettings().setDisplayZoomControls(true);
            webview_help.loadUrl(url);


        }
        else {

            CommonUtils.commonToast(HelpWebviewActivity.this, getResources().getString(R.string.no_internet_exist));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
person Adil    schedule 25.01.2018

Попробуйте эти настройки:

WebSettings websettings = mWebView.getSettings();
websettings.setDomStorageEnabled(true);
websettings.setJavaScriptEnabled(true);
person yu wang    schedule 25.01.2018
comment
Вы должны описать, что эти строки делают, чтобы решить проблему. Это повысит качество вашего поста. - person CaptainBli; 25.01.2018