Приложение для Android не одобрено обработчиком ошибок SSL

В прошлом месяце я выпустил рабочее приложение для Android, но у меня возникли проблемы с обработчиком ошибок SSL.

Я следил за учебными пособиями Stackoverfollow и Google, однако Google по-прежнему не одобряет мое приложение (примечание: этот QA не является дубликатом).

  1. https://support.google.com/faqs/answer/7071387
  2. Обработчик ошибок SSL WebView Android

Мой код реализован следующим образом:

Любой фрагмент или действие, использующее WebViewClient, я контролировал ошибку SSL, подобную этой

    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            LogI("onReceivedSslError: " + error.getCertificate());
            AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
            AlertDialog alertDialog = builder.create();
            String message;
            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;
                default:
                    message = "A generic error occurred.";
                    break;
            }
            message += " Do you want to continue anyway?";
            alertDialog.setTitle("SSL Certificate Error");
            alertDialog.setMessage(message);
            alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", (dialog, which) -> handler.proceed());
            alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", (dialog, which) -> handler.cancel());
            alertDialog.show();
        }

Итак, почему мое приложение не одобрено? Что я должен делать дальше?

Спасибо за ваш совет!

Обновление 1: я выпустил свое приложение в 2019 году и много раз обновлял его (проблем не было). Но с 2021/5 у меня возникла эта проблема.


person Jason    schedule 12.07.2021    source источник
comment
Проверьте это support.google.com/faqs/answer/7071387.   -  person Eishon    schedule 12.07.2021
comment
@Eishon наша команда также прочитала это и внедрила, но вы можете увидеть результат, показанный выше.   -  person Jason    schedule 12.07.2021


Ответы (2)


вам нужно позвонить либо handler.cancel(); (это для вашего случая), либо super.onReceivedSslError(view, handler, error); прямо внутри onReceivedSslError. ЗДЕСЬ у вас есть документ, в котором:

Ведущее приложение должно вызвать либо SslErrorHandler#cancel, либо SslErrorHandler#proceed.

а также

Переопределение приложения этого метода может отображать пользовательские страницы ошибок или автоматически регистрировать проблемы, но настоятельно рекомендуется всегда вызывать SslErrorHandler#cancel и никогда не разрешать обработку прошлых ошибок.

без каких-либо из этих вызовов некоторые бот Google, который проверяет приложения, может подумать, что вы вообще отключаете любую проверку SSL, что может быть небезопасным для пользователя.

person snachmsm    schedule 12.07.2021
comment
если происходит onReceivedSslError(), я показываю всплывающее окно с двумя кнопками Cancel и OK, это эквивалентно handler.cancel() handler.proceed(). Я не знаю, почему Google Bot не принимает его. - person Jason; 12.07.2021
comment
похоже, что handler следует вызывать вскоре после вызова onReceivedSslError. ваш диалог требует некоторого времени для рисования и еще больше времени для принятия решения пользователем. бот этого не поймет, ждет hander вызова в миллисекундах - person snachmsm; 12.07.2021
comment
Спасибо, но я попробовал свой apk, который совпадает с опубликованным apk в Google Play, до сих пор я еще не решил эту проблему. Я хотел бы опубликовать это в сообществе Twitter, у вас есть предложения по этому поводу? - person Jason; 20.07.2021
comment
Вы пытались поместить APK в магазин игр с вызовом handler.proceed() или handler.cancel() прямо внутри onReceivedSslError? если вы все еще получаете отказ, то я не знаю, как это исправить... сообщество может помочь в таком случае, стоит попробовать - person snachmsm; 20.07.2021

Это код, который я использовал в своем приложении, и он был принят. Единственное отличие, которое я вижу, это блок try-catch. Я предлагаю сначала попробовать более простую версию в Play Store, а затем обновить ее, указав сообщение об ошибке определенного типа.

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    try{
        final AlertDialog.Builder builder = new AlertDialog.Builder(PaymentActivity.this);
        builder.setMessage(R.string.notification_error_ssl_cert_invalid);
        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();
    }catch (Exception e){
        e.printStackTrace();
    }
}
person Eishon    schedule 12.07.2021
comment
если дело во времени, позвольте мне попробовать ваш ответ и ответ @snachmsm. Спасибо, и я обновлю свое решение. - person Jason; 12.07.2021
comment
это не работает, хотя я связался с командой Google Play - person Jason; 03.08.2021