持久化用户忽略SSL错误的选择(提示后)
持久化用户忽略SSL错误的选择(提示后)
当然可以!你想用SharedPreferences来保存用户对特定URL的SSL错误选择,这个思路完全没问题,而且很符合Google Play的要求——毕竟是用户主动做出的选择,不是程序默认忽略SSL风险,不会触发审核问题。
具体实现步骤
第一步:确定存储规则
用SharedPreferences存键值对,键可以选两种方式:- 完整URL:精确匹配,只有完全相同的URL才会复用之前的选择
- 域名(主机名):比如提取
Uri.parse(url).getHost()作为键,这样同一个域名下的所有子页面都会共用用户的信任选择,适合用户信任整个网站的场景
根据你的业务需求选就好,推荐如果没有特殊需求,用域名更符合用户直觉。
第二步:处理用户选择并存储
当弹出对话框让用户做选择时,把结果写入SharedPreferences:// 点击"继续访问"时 SharedPreferences sslPrefs = getSharedPreferences("SslTrustRecords", MODE_PRIVATE); // 这里用域名作为键,你也可以换成完整URL String trustKey = Uri.parse(view.getUrl()).getHost(); sslPrefs.edit().putBoolean(trustKey, true).apply(); handler.proceed(); // 点击"取消"时 sslPrefs.edit().putBoolean(trustKey, false).apply(); handler.cancel();第三步:在SSL错误回调中优先读取存储的选择
每次触发onReceivedSslError时,先检查有没有已保存的记录,再决定自动处理还是弹窗:@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { String currentUrl = view.getUrl(); String trustKey = Uri.parse(currentUrl).getHost(); // 用域名作为匹配键 SharedPreferences sslPrefs = getSharedPreferences("SslTrustRecords", MODE_PRIVATE); if (sslPrefs.contains(trustKey)) { boolean isTrusted = sslPrefs.getBoolean(trustKey, false); if (isTrusted) { handler.proceed(); // 用户之前同意过,直接继续 } else { handler.cancel(); // 用户之前拒绝过,直接取消 } } else { // 没有记录,弹出对话框让用户选择 new AlertDialog.Builder(context) .setTitle("SSL证书验证异常") .setMessage("此网站的安全证书未被系统信任,是否继续访问?") .setPositiveButton("继续", (dialog, which) -> { sslPrefs.edit().putBoolean(trustKey, true).apply(); handler.proceed(); }) .setNegativeButton("取消", (dialog, which) -> { sslPrefs.edit().putBoolean(trustKey, false).apply(); handler.cancel(); }) .setCancelable(false) .show(); } }
关键注意事项
- 合规性第一:绝对不能省略用户确认环节直接自动允许SSL错误,必须先弹窗让用户明确选择,保存选择只是优化后续体验,这一点是Google Play审核的红线。
- 给用户管理权限:建议在应用设置里加一个“清除信任的SSL记录”的选项,让用户能随时重置之前的选择,既贴心也更安全。
- SharedPreferences权限:一定要用
MODE_PRIVATE模式存储,避免其他应用读取或修改这些信任记录,保证数据安全。
备注:内容来源于stack exchange,提问作者Mohamed AbdulRaouf
相关产品推荐
相关产品推荐

