SignalR在浏览器正常运行,Android APK无法连接问题排查
针对你的问题,以下是几个大概率能解决的方向,按优先级排查:
1. 安卓网络安全策略阻止明文HTTP请求
安卓9及以上版本默认禁止明文HTTP通信,Expo Go在开发模式会自动绕过这个限制,但EAS打包的正式APK不会。如果你的SignalR Hub用的是HTTP,必须配置网络安全规则:
- 在项目根目录创建
android/app/src/main/res/xml/network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 替换成你的SignalR Hub服务器域名或IP --> <domain includeSubdomains="true">server_where_hub_is_hosted</domain> <domain includeSubdomains="true">你的服务器内部IP</domain> </domain-config> </network-security-config>
- 打开
android/app/src/main/AndroidManifest.xml,在<application>标签里添加:
android:networkSecurityConfig="@xml/network_security_config"
2. 显式指定SignalR传输协议
浏览器和Expo Go可能自动优先使用WebSocket,但打包后的APK可能因为环境限制无法建立WebSocket连接,需要强制启用兼容的传输方式:
修改客户端连接代码,添加传输类型指定:
const connection = new signalR.HubConnectionBuilder() .withUrl("http://server_where_hub_is_hosted:5000/stockHub", { // 同时支持WebSocket和长轮询 transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling }) .configureLogging(signalR.LogLevel.Information) .withAutomaticReconnect() .build();
3. 检查服务端HSTS配置
你的服务端在非开发环境启用了app.UseHsts(),HSTS会强制客户端使用HTTPS连接,如果你的Hub还是HTTP,就会导致连接失败。测试阶段可以暂时注释掉这行代码:
// if (!app.Environment.IsDevelopment()) // { // app.UseExceptionHandler("/Home/Error"); // // 注释掉HSTS,测试HTTP连接 // // app.UseHsts(); // }
生产环境建议把SignalR Hub切换到HTTPS。
4. 确认EAS打包时的Hub地址正确
检查你的环境变量配置,确保打包时用的是正确的Hub地址,而不是开发环境的本地地址:
- 在
app.config.js里配置公开环境变量:
export default { expo: { // ...其他配置 extra: { hubUrl: process.env.EXPO_PUBLIC_HUB_URL, }, }, };
- 客户端代码里使用这个变量:
const connection = new signalR.HubConnectionBuilder() .withUrl(process.env.EXPO_PUBLIC_HUB_URL) // ...其他配置 .build();
- 在
eas.json的preview profile里确保环境变量正确传入,或者打包前手动设置EXPO_PUBLIC_HUB_URL。
5. 验证安卓网络权限
虽然Expo默认会添加INTERNET权限,但偶尔打包配置可能遗漏,检查app.json:
{ "expo": { "android": { "permissions": ["INTERNET"] } } }
内容的提问来源于stack exchange,提问作者Carlos Costa
相关产品推荐
相关产品推荐

