You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native Expo项目:EAS构建的Android APK无法连接API服务器,但Expo Go正常,如何修复网络安全问题?

React Native Expo项目:EAS构建的Android APK无法连接API服务器,但Expo Go正常,如何修复网络安全问题?

这种情况我之前开发Expo项目时也碰到过,核心原因是Expo Go为了开发便利放宽了网络安全限制,但正式打包的Android APK会严格遵循系统的网络安全策略。结合你提供的app.json配置,咱们一步步来定位修复:

1. 先检查你的network_security_config.xml是否配置正确

你已经在app.json里指定了这个网络安全配置文件,但如果内容不符合需求,会直接导致API请求被拦截。打开./assets/xml/network_security_config.xml,确保它包含以下关键配置:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 全局基础配置:允许明文流量(如果你的API是HTTP的话) -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 信任系统默认证书(适用于HTTPS公网API) -->
            <certificates src="system" />
            <!-- 如果你的API用的是自签名HTTPS证书,需要添加下面这行,把证书放在res/raw目录下 -->
            <!-- <certificates src="@raw/your_self_signed_certificate" /> -->
        </trust-anchors>
    </base-config>

    <!-- 针对你的API域名单独配置(更安全,推荐) -->
    <domain-config cleartextTrafficPermitted="true">
        <!-- 替换成你的API实际域名/IP,includeSubdomains=true表示包含子域名 -->
        <domain includeSubdomains="true">your-api-domain.com</domain>
        <!-- 如果是本地测试,确保手机和服务器在同一局域网,用服务器的局域网IP,比如192.168.1.100 -->
        <!-- <domain includeSubdomains="true">192.168.1.100</domain> -->
    </domain-config>
</network-security-config>

注意:如果你的API是HTTPS且用的是正规CA签发的证书,cleartextTrafficPermitted可以设为false,但如果是HTTP或者自签名证书,必须设为true并配置信任。

2. 确认API地址不是「本地开发地址」

这是新手最容易踩的坑:

  • 在Expo Go里开发时,你可能用的是电脑的局域网IP(比如192.168.1.xxx)或者localhost,但打包成APK后:
    • 如果手机不在和开发电脑同一局域网,这个地址就访问不到
    • 手机的localhost指向的是手机自身,不是你的开发电脑
  • 解决方案:把API地址替换成公网可访问的域名/IP,或者在测试APK时,确保手机和服务器在同一局域网,并且用服务器的正确局域网IP(不要用localhost)。

3. 验证app.json的网络相关配置是否生效

你已经设置了usesCleartextTraffic: true,但要确保和networkSecurityConfig的配置不冲突:

  • 两者的cleartextTrafficPermitted要保持一致
  • 检查android.permissions里是否包含INTERNET权限(Expo通常会自动添加,但可以手动加上确保):
"android": {
  // ...其他配置
  "permissions": ["android.permission.INTERNET"]
}

4. 排查构建时的API地址是否正确

如果你的代码里写死了开发环境的API地址,打包时没切换到生产环境地址,也会导致连不上。推荐用Expo的extra字段管理环境变量:

  1. app.json里添加:
"extra": {
  "API_URL": "https://your-production-api.com"
}
  1. 代码里通过expo-constants获取:
import Constants from 'expo-constants';
const API_URL = Constants.expoConfig?.extra?.API_URL || 'http://default-api.com';

这样开发和构建时可以通过环境变量或者不同的app.json配置切换地址。

5. 用adb日志定位具体错误

如果以上步骤都没解决问题,连接你的Android手机到电脑,运行以下命令查看详细错误日志:

adb logcat *:E

然后打开APK尝试登录,找到和网络相关的错误信息(比如SSLHandshakeExceptionUnknownHostException),这些日志会告诉你具体是证书不被信任、DNS解析失败,还是连接超时,能帮你精准定位问题。

最后总结

先从API地址和网络安全配置入手,这两个是最常见的原因。如果还是不行,用adb日志抓具体错误,基本上就能解决了。

火山引擎 最新活动