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字段管理环境变量:
- 在
app.json里添加:
"extra": { "API_URL": "https://your-production-api.com" }
- 代码里通过
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尝试登录,找到和网络相关的错误信息(比如SSLHandshakeException、UnknownHostException),这些日志会告诉你具体是证书不被信任、DNS解析失败,还是连接超时,能帮你精准定位问题。
最后总结
先从API地址和网络安全配置入手,这两个是最常见的原因。如果还是不行,用adb日志抓具体错误,基本上就能解决了。




