告别net::ERR_CLEARTEXT_NOT_PERMITTED:Capacitor打包UniApp H5到Android的HTTP请求避坑全记录

张开发
2026/5/3 17:50:25 15 分钟阅读

分享文章

告别net::ERR_CLEARTEXT_NOT_PERMITTED:Capacitor打包UniApp H5到Android的HTTP请求避坑全记录
深度解决Capacitor打包UniApp H5到Android的HTTP请求拦截问题当使用Capacitor将UniApp开发的H5应用打包成Android应用时很多开发者会遇到一个令人头疼的问题应用中的HTTP请求被拦截控制台抛出net::ERR_CLEARTEXT_NOT_PERMITTED错误。这并非代码逻辑问题而是Android系统从9.0版本开始引入的网络安全策略导致的。本文将带你深入理解这一问题的根源并提供一套完整的解决方案。1. 问题根源Android网络安全策略演变Android 9.0API级别28引入了一项重要的安全变更默认禁止应用使用明文非HTTPS网络流量。这项变更旨在提升用户数据安全性防止中间人攻击。具体表现为默认行为应用无法通过HTTP协议与服务器通信错误表现控制台显示net::ERR_CLEARTEXT_NOT_PERMITTED影响范围所有WebView中的请求包括XHR和fetch API对于混合应用开发者来说这项变更带来了不小的挑战特别是当后端服务尚未升级到HTTPS时。Capacitor作为混合应用框架其内置的WebView同样受到这一策略的限制。2. 解决方案全景图解决net::ERR_CLEARTEXT_NOT_PERMITTED问题需要从多个层面进行配置。以下是完整的解决方案矩阵解决方案适用场景实现方式安全性影响修改AndroidManifest开发环境/临时方案添加usesCleartextTraffic属性降低安全性配置网络安全策略生产环境推荐创建network_security_config.xml可控的安全策略统一协议方案长期最佳实践前端和后端统一使用HTTPS最高安全性3. 分步解决方案实施3.1 基础方案修改AndroidManifest.xml这是最直接的解决方案适合开发阶段快速解决问题打开Android项目中的AndroidManifest.xml文件路径通常为android/app/src/main/AndroidManifest.xml在application标签中添加以下属性android:usesCleartextTraffictrue完整的application标签示例application android:usesCleartextTraffictrue ...其他属性重新构建应用npx cap sync android npx cap open android注意这种方法虽然简单但会全局允许明文流量降低了应用的整体安全性不建议在生产环境中使用。3.2 进阶方案配置网络安全策略对于生产环境更推荐使用细粒度的网络安全配置创建网络安全配置文件在android/app/src/main/res/xml/目录下创建network_security_config.xml如果xml目录不存在需要先创建编辑network_security_config.xmlnetwork-security-config domain-config cleartextTrafficPermittedtrue domain includeSubdomainstrueyourdomain.com/domain domain includeSubdomainstrueapi.yourdomain.com/domain /domain-config /network-security-config修改AndroidManifest.xml引用此配置application android:networkSecurityConfigxml/network_security_config ...其他属性重新构建应用这种方式的优势在于只允许特定域名的明文流量其他请求仍然强制使用HTTPS符合Google Play的安全要求3.3 Capacitor特定配置除了Android层面的配置Capacitor本身也提供了一些相关设置修改capacitor.config.json中的androidScheme{ android: { scheme: http, allowMixedContent: true } }关键参数说明scheme设置WebView使用的默认协议allowMixedContent允许加载混合内容HTTPS页面中的HTTP资源同步配置到原生项目npx cap sync android4. 开发与生产环境的最佳实践针对不同环境建议采用不同的策略组合4.1 开发环境配置本地调试!-- AndroidManifest.xml -- application android:usesCleartextTraffictrue tools:targetApi28模拟特定域名!-- network_security_config.xml -- domain-config cleartextTrafficPermittedtrue domain includeSubdomainstruelocalhost/domain domain includeSubdomainstrue10.0.2.2/domain /domain-config4.2 生产环境配置强制HTTPS理想情况network-security-config base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem / /trust-anchors /base-config /network-security-config过渡期配置必须使用HTTP时domain-config cleartextTrafficPermittedtrue domain includeSubdomainstruelegacy-api.example.com/domain /domain-config5. 常见问题排查指南即使按照上述方案配置后仍可能遇到各种问题。以下是常见问题及解决方法配置修改后无效确保执行了npx cap sync android清理构建缓存cd android ./gradlew clean特定API级别不生效uses-sdk android:minSdkVersion21 android:targetSdkVersion33 /WebView混合内容问题// 在MainActivity.java中添加 import android.webkit.WebSettings; public class MainActivity extends BridgeActivity { Override public void onStart() { super.onStart(); WebSettings settings this.bridge.getWebView().getSettings(); settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } }Capacitor插件兼容性问题检查插件是否支持HTTP请求考虑使用原生HTTP客户端插件替代6. 长期解决方案全面迁移到HTTPS虽然上述方案可以解决眼前的问题但从长远来看将后端服务迁移到HTTPS才是根本解决方案。迁移过程中可以考虑证书获取Lets Encrypt提供免费证书商业证书提供更长的有效期和保险前端适配// 统一使用https协议 const baseURL process.env.NODE_ENV production ? https://api.example.com : https://dev-api.example.com;混合内容处理!-- 在index.html中添加meta标签 -- meta http-equivContent-Security-Policy contentupgrade-insecure-requests测试工具SSL Labs测试https://www.ssllabs.com/ssltest/混合内容扫描器Chrome开发者工具的Security面板在实际项目中我曾遇到一个案例团队花了三天时间排查各种网络问题最终发现是Android 10设备上的一个特殊策略导致。这个经验让我深刻认识到理解平台安全策略的重要性不亚于编写业务代码。

更多文章