Expo React Native应用APK构建后无法接收AWS EC2 API响应问题排查
可能的原因及解决方法
1. 缺少网络权限
- 原因:Expo开发模式默认包含网络权限,但生产APK构建需要显式声明权限。
- 解决:在项目根目录的
app.json中,给android.permissions添加INTERNET权限:{ "expo": { "android": { "permissions": ["INTERNET"] } } }
2. API地址使用本地环回地址
- 原因:开发时若用
localhost或127.0.0.1测试API,Expo隧道会转发请求到本地服务,但打包后的APK无法访问这些本地地址,EC2的API必须使用公网可访问的IP或域名。 - 解决:将API基础URL替换为EC2实例的公网IP或已绑定的域名,先在手机浏览器中验证该地址能正常访问API接口。
3. EC2安全组/防火墙拦截请求
- 原因:开发时你的本地IP可能在EC2安全组允许列表中,但手机使用的移动网络或其他WiFi的IP不在范围内,导致请求被拦截。
- 解决:
- 登录AWS控制台,进入EC2实例的安全组配置,添加入站规则,允许API服务对应的端口(如80/443)来自
0.0.0.0/0(测试用,生产环境可限制更严格的IP段)。 - 检查EC2实例内部的防火墙(如
iptables),确保未阻止对应端口的入站请求。
- 登录AWS控制台,进入EC2实例的安全组配置,添加入站规则,允许API服务对应的端口(如80/443)来自
4. 明文HTTP请求被Android限制
- 原因:Android 9及以上版本默认禁止明文HTTP请求,开发模式下Expo会绕过此限制,但生产APK会严格执行,若EC2 API用HTTP协议,请求会被拒绝。
- 解决:
- 推荐方案:给EC2的API配置HTTPS证书(比如用Let's Encrypt免费证书),改用HTTPS请求。
- 临时测试方案:在
app.json中开启明文HTTP支持(不建议生产环境使用):{ "expo": { "android": { "usesCleartextTraffic": true } } }
5. 环境变量未正确注入
- 原因:开发时用
.env文件存储API地址等环境变量,但打包时未将生产环境变量正确注入APK,导致请求地址错误。 - 解决:
- 使用EAS构建时,通过
--env参数传递生产环境变量,或在eas.json的构建配置中定义环境变量。 - 也可直接在
app.json的expo.extra字段中配置生产环境API地址,代码中通过Constants.expoConfig.extra.apiUrl获取。
- 使用EAS构建时,通过
6. API服务器CORS配置限制
- 原因:虽然React Native不严格遵循浏览器的CORS规则,但部分API服务器会限制请求来源,开发时Expo代理可能自动处理了CORS,打包后直接请求时被服务器拒绝。
- 解决:修改EC2上API服务器的CORS配置,允许所有来源(
*),React Native请求的Origin通常不固定,设为*即可满足需求。
内容的提问来源于stack exchange,提问作者Mohammd Ali Shaikh
相关产品推荐
相关产品推荐

