React Native Android真机网络请求失败问题求助
React Native裸工作流真机请求Docker Keycloak失败解决方案
核心问题分析
10.0.2.2是Android模拟器专属的本地回环地址,真机完全无法识别,改用该地址只会导致请求超时192.168.x.x无法访问的核心原因大概率是Docker端口绑定限制或电脑防火墙拦截
分步解决步骤
1. 修正Keycloak的Docker端口映射
确保启动Docker时将Keycloak端口绑定到所有网卡,而非仅本地回环,否则局域网设备(包括真机)无法访问:
# 替换原启动命令的端口映射部分 docker run ... -p 0.0.0.0:8080:8080 ... quay.io/keycloak/keycloak:latest start-dev
2. 配置真机访问的正确IP
- 确保真机与运行Docker的电脑连接同一WiFi网络
- 查看电脑的局域网IP:Windows用
ipconfig,Mac/Linux用ifconfig或ip addr - 将代码中的URL替换为该IP:
const url = `http://192.168.x.x:8080/realms/testrealm/protocol/openid-connect/token`;
3. 完善Android网络安全配置
除了android:usesCleartextTraffic="true",针对Release包需额外配置网络安全规则:
- 在
android/app/src/main/res/xml目录下创建network_security_config.xml(无xml目录则新建):<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.x.x</domain> <!-- 替换为你的电脑局域网IP --> </domain-config> </network-security-config> - 在
AndroidManifest.xml的<application>标签中添加引用:<application ... android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/network_security_config">
4. 排查电脑防火墙
- 暂时关闭电脑防火墙测试是否能访问,若恢复正常则添加8080端口的入站放行规则
- 确保防火墙允许Docker容器的网络流量通过
5. 动态区分环境(可选优化)
为同时兼容模拟器和真机,可通过设备信息动态切换URL:
import { Platform } from 'react-native'; // 判断是否为模拟器 const isEmulator = Platform.OS === 'android' && !Platform.isDevice; const baseUrl = isEmulator ? 'http://10.0.2.2:8080' : 'http://192.168.x.x:8080'; const url = `${baseUrl}/realms/testrealm/protocol/openid-connect/token`;
调试技巧
用adb查看真机的详细日志,定位具体错误:
adb logcat *:S ReactNative:V ReactNativeJS:V
内容的提问来源于stack exchange,提问作者Keill VunStroke
相关产品推荐
相关产品推荐

