【问题标题】:Android App is not approved with SSL Error HandlerAndroid 应用程序未通过 SSL 错误处理程序获得批准
【发布时间】:2021-07-12 05:07:07
【问题描述】:

我上个月发布了一个生产 Android 应用程序,但我在使用 SSL 错误处理程序时遇到了问题。

我遵循了 Stackoverfollow 和 Google 的教程,但是 Google 仍然没有批准我的应用程序(注意:此 QA 不是重复的)。

  1. https://support.google.com/faqs/answer/7071387
  2. SSL Error Handler WebView Android

我的代码实现如下:

任何使用 WebViewClient 的 Fragment 或 Activity,我都控制了这样的 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 开始,我遇到了这个问题。

【问题讨论】:

标签: android android-fragments google-play android-security


【解决方案1】:

这些错误可能来自旧 APK、AAB 版本,请在提交新 APK、AAB 之前删除/停用它

【讨论】:

    【解决方案2】:

    您必须直接在onReceivedSslError 内致电handler.cancel();(这是您的情况)或super.onReceivedSslError(view, handler, error);HERE你有一些文档,其中:

    宿主应用程序必须调用 SslErrorHandler#cancel 或 SslErrorHandler#proceed

    还有

    此方法的应用程序覆盖可能会显示自定义错误页面或静默记录问题,但强烈建议始终调用 SslErrorHandler#cancel 并且绝不允许继续过去的错误。

    如果没有任何这些调用,一些检查应用程序的 Google 机器人可能会认为您完全禁用了任何 SSL 验证,这对用户来说可能是不安全的

    【讨论】:

    • 如果 onReceivedSslError() 发生,我会显示一个弹出窗口,其中有 2 个按钮“取消”和“确定”,它们是等效的 handler.cancel() handler.proceed()。我不知道为什么 Google Bot 不接受它。
    • 似乎handler 应该在onReceivedSslError 被调用后“很快”被调用。您的对话需要一些时间来绘制,而用户决策需要更多时间。机器人不会“理解”这一点,等待hander 以毫秒为单位调用
    • 谢谢,但是我试过我的apk,和Google Play上发布的apk一样,直到现在我还没有解决这个问题。我想把它发布到 Twitter 社区,你有什么建议吗?
    • 您是否尝试将 APK 放入 Play 商店,并在 onReceivedSslError 中直接调用 handler.proceed()handler.cancel()?如果您仍然被拒绝,那么我不知道如何“解决”这个问题......在这种情况下社区可能会有所帮助,值得尝试
    【解决方案3】:

    这是我在我的应用程序中使用的代码,它被接受了。我看到的唯一区别是 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();
        }
    }
    

    【讨论】:

    • 如果问题是时间,让我试试你的答案和@snachmsm 的答案。谢谢你,我会更新我的解决方案。
    • 这不起作用,虽然我联系了 Google Play 团队
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多