WebView 中加载非 HTTPS 网站的终极指南
2024-03-10 16:51:46
如何在 WebView 中加载非 HTTPS 网站
问题:Web 安全性与 WebView
随着网络安全威胁的不断增加,现代浏览器和平台采取了严格措施来保护用户数据和隐私。其中一项关键措施是要求所有网站使用 HTTPS 协议。HTTPS 通过加密来保护数据,确保信息在传输过程中不被拦截或窃取。
因此,在 Android Instant Apps 中,WebView 仅允许加载使用 HTTPS 协议的安全网站。如果你尝试在 WebView 中加载非 HTTPS 网站,你会遇到 "ERR_CLEARTEXT_NOT_PERMITTED" 错误。
方法 1:禁用 Instant App
如果你的应用不是 Instant App,禁用 Instant App 模式即可。
- 在 Android Studio 中打开项目的
build.gradle
文件(项目级)。 - 查找以下行:
instantApp {
buildMode 'traditional'
}
- 将
traditional
替换为instant
以启用 Instant App。
方法 2:使用自定义 WebViewClient
如果禁用 Instant App 不可行,则可以使用自定义 WebViewClient
来允许 WebView 加载非 HTTPS 网站。
- 创建一个自定义
WebViewClient
类,并重写shouldOverrideUrlLoading
方法:
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 允许加载非 HTTPS 网站
if (!url.startsWith("https://")) {
view.loadUrl(url);
return true;
}
return false;
}
}
- 在
WebView
中设置自定义WebViewClient
:
wv.setWebViewClient(new MyWebViewClient());
注意事项
值得注意的是,这些方法仅适用于 Android 9 及更低版本。Android 10 及更高版本强制 WebView 仅加载 HTTPS 网站。对于需要在 Android 10 及更高版本中加载非 HTTPS 网站的应用,建议使用自定义浏览器或第三方库。
结论
通过禁用 Instant App 或使用自定义 WebViewClient
,你可以允许 WebView 加载非 HTTPS 网站,从而解决 "ERR_CLEARTEXT_NOT_PERMITTED" 错误。请根据你的具体情况选择最合适的方法。
常见问题解答
1. 为什么需要在 WebView 中加载非 HTTPS 网站?
某些网站可能由于兼容性或其他原因而无法提供 HTTPS 版本。
2. 禁用 Instant App 会对我的应用产生哪些影响?
禁用 Instant App 意味着用户将无法在不安装应用的情况下使用你的应用。
3. 使用自定义 WebViewClient 会影响 WebView 的其他功能吗?
不会,自定义 WebViewClient
主要用于处理 URL 加载行为,不会影响 WebView 的其他功能,例如 JavaScript 执行或 DOM 操作。
4. 除了禁用 Instant App 和使用自定义 WebViewClient 之外,还有其他方法可以加载非 HTTPS 网站吗?
可以使用自定义浏览器或第三方库,但这些方法可能需要额外的开发工作。
5. Android 10 及更高版本中有哪些加载非 HTTPS 网站的替代方案?
建议使用 StrictMode
或 WebViewClient
的 onReceivedHttpError
方法来处理非 HTTPS 网站加载错误,并提供用户友好型错误消息。