如何让Cordova应用WebView使用http://localhost而非https://localhost运行?
解决targetSdkVersion 31后WebView阻止HTTP CORS请求的问题
问题原因
Android 12(API Level 31)收紧了WebView的混合内容策略:当页面以HTTPS加载时,默认会拦截所有HTTP协议的资源请求(包括XMLHttpRequest),这是系统层面的安全限制,目的是防止不安全的HTTP资源给HTTPS页面带来风险。而API 30及以下版本的默认策略相对宽松,未触发该拦截。
解决方案
1. 优先方案:将后端接口升级为HTTPS
这是最安全、合规的解决方式,彻底消除混合内容问题,同时符合现代Web安全标准,避免后续Android版本的进一步限制。
2. 临时兼容方案(仅适用于无法立刻升级HTTPS的场景)
通过配置WebView的混合内容模式,允许HTTPS页面加载HTTP资源:
WebSettings webSettings = webView.getSettings(); // 根据Android版本设置混合内容模式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // API 33+推荐使用兼容模式,仅允许安全的HTTP资源加载 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); } else { // 允许所有HTTP资源加载(API 31+仍可用,但官方不推荐) webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
注意:MIXED_CONTENT_ALWAYS_ALLOW会降低页面安全性,若应用需上架Google Play,建议仅作为临时过渡方案,尽快完成HTTPS升级。
3. 检查本地服务配置
如果应用内部的localhost是从HTTP切换为HTTPS导致的问题,可评估是否需要保持本地服务为HTTP(若符合Google Play的要求),但通常更推荐统一使用HTTPS,或结合上述混合内容配置解决。
内容的提问来源于stack exchange,提问作者fcaserio
相关产品推荐
相关产品推荐

