You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native 0.66.4 fetch调用自签HTTPS接口报网络错误如何解决

问题根因

NSAllowsArbitraryLoads 仅用于放开iOS ATS策略对HTTP明文请求的限制,完全不涉及SSL证书合法性校验逻辑。你遇到的报错本质是自签名证书不在系统内置的受信根证书列表中,iOS/安卓原生网络层在TLS握手阶段直接拦截了不受信证书的请求,和ATS配置是否开启没有关系,所以单独配置Info.plist无法解决问题。

分平台解决方案

iOS端(针对RN 0.66.4版本验证有效)

  • 首先修正Info.plist中的ATS配置,不要只开全局任意加载,需要针对你访问的局域网IP添加单独的例外规则,配置示例如下:
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
  <key>NSExceptionDomains</key>
  <dict>
    <!-- 替换为你实际调用的API服务端局域网IP -->
    <key>192.168.1.100</key>
    <dict>
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>
  • 补充NSURLSession证书信任回调,允许自签证书通过校验。打开ios/[你的项目名]/AppDelegate.m文件,在@implementation AppDelegate块内、didFinishLaunchingWithOptions方法外添加如下代码:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
  completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
  • 配置完成后进入ios目录执行pod install,重新编译运行项目即可。

安卓端

  • 首先在android/app/src/main/AndroidManifest.xml的<application>标签中添加android:usesCleartextTraffic="true",放开明文请求限制。
  • 新建自定义信任管理器类,路径为android/app/src/main/java/[你的项目包名]/TrustAllCerts.java,代码如下:
import java.security.cert.CertificateException;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

public class TrustAllCerts implements X509TrustManager {
  @Override
  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  @Override
  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  @Override
  public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}
  • 修改同目录下的MainApplication.java,覆盖RN默认的OkHttp客户端配置,注入自定义信任管理器跳过证书校验,重新编译打包即可生效。

快速调试方案(仅本地联调用)

如果不想修改原生代码,可以在JS层通过axios配置跳过证书校验,注意该方案无法通过App Store审核,仅适合开发阶段使用:

import axios from 'axios';
import https from 'https';
const httpsAgent = new https.Agent({
  rejectUnauthorized: false // 关闭证书校验
});
// 发起请求时传入agent
const res = await axios.get('https://192.168.1.100/api/test', { httpsAgent });
生产环境注意事项
  • 上述全量跳过证书校验的逻辑绝对不能带到生产环境,否则会存在严重的中间人攻击安全风险。
  • 生产环境如果需要访问局域网自签证书接口,建议将服务端自签根证书内置到App安装包中,实现SSL Pinning(证书绑定),仅信任指定的自签证书即可。

内容的提问来源于stack exchange,提问作者Gabriel P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.18 16:15:42