电脑端Unity可连SignalR Hub,手机端同款Unity无法连接问题排查
问题分析与排查方案
可能的核心原因
- 安卓网络权限未正确配置
- SignalR传输协议与安卓Unity环境不兼容
- Conveyor by Keyoti的转发/证书配置问题
- IIS的CORS策略未覆盖SignalR请求
- 服务器与Unity客户端的SignalR版本不匹配
- 网络层面(防火墙、端口映射)的拦截
分步排查步骤
1. 确认安卓网络权限
- 检查Unity安卓项目的
AndroidManifest.xml,确保包含以下权限:
若使用Unity 2020+,可直接在<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Player Settings > Publishing Settings中,将Internet Access设为Require。 - 用手机浏览器访问
http://你的公网IP/你的Hub名称/negotiate,若无法返回JSON格式的协商响应,说明网络层面存在基础连通问题。
2. 适配SignalR传输协议
- 安卓Unity环境对WebSocket的支持可能存在兼容性问题,可强制使用Long Polling协议测试:
var connection = new HubConnectionBuilder() .WithUrl("http://你的公网IP/你的Hub名称", options => { options.Transports = HttpTransportType.LongPolling; }) .Build(); - 检查IIS是否启用WebSocket功能:在IIS管理器的服务器节点下,确保
WebSocket功能已开启,否则SignalR无法使用WebSocket传输。
3. 排查Conveyor by Keyoti配置
- Conveyor默认生成自签名HTTPS证书,安卓设备会不信任该证书导致连接失败。可临时切换为HTTP地址测试,或在安卓设备上手动安装Conveyor的根证书。
- 确认Conveyor的端口映射包含SignalR Hub的端点,且配置界面中允许外部设备访问所有需要的端口(如IIS的80/443或Conveyor转发端口)。
4. 验证IIS的CORS配置
- SignalR的CORS要求与普通HTTP请求不同,需确保ASP.NET Core项目的CORS策略包含
AllowCredentials:builder.Services.AddCors(options => { options.AddPolicy("SignalRCors", policy => { policy.WithOrigins("*") // 测试用,生产环境需指定具体来源 .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // SignalR必须开启此项 }); }); app.UseCors("SignalRCors"); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapHub<你的Hub类>("/你的Hub名称"); });
5. 核对SignalR版本一致性
- 确保Unity端使用的
Microsoft.AspNetCore.SignalR.Client包版本,与ASP.NET Core服务器端的Microsoft.AspNetCore.SignalR版本完全一致。版本不匹配会导致协商失败且无明确错误提示。
6. 添加错误日志捕获
- Unity安卓端无错误提示是因为未捕获SignalR的连接异常,添加日志代码获取具体错误信息:
connection.Closed += async (error) => { Debug.LogError($"SignalR连接关闭: {error?.Message ?? "无错误信息"}"); await Task.Delay(2000); await connection.StartAsync(); }; try { await connection.StartAsync(); Debug.Log("SignalR连接成功"); } catch (Exception ex) { Debug.LogError($"连接失败: {ex.Message}\n堆栈信息: {ex.StackTrace}"); } - 通过Unity的Android Logcat工具查看日志,或输出到本地文件,定位具体错误(如证书验证失败、协商超时等)。
7. 网络层面排查
- 检查路由器端口映射:确保公网IP的对应端口(如80/443)已正确映射到本地IIS服务器的内网IP和端口,部分路由器需重启后映射生效。
- 临时关闭Windows防火墙测试,若能连接则说明防火墙拦截了请求,需添加允许规则放行IIS应用或对应端口。
- 用内网IP测试:让安卓设备直接连接本地服务器的内网IP(如
192.168.x.x),若能连接则问题出在公网路由或Conveyor转发配置;若仍无法连接,则聚焦安卓Unity端或IIS配置。
内容的提问来源于stack exchange,提问作者can ağlar kırıcı
相关产品推荐
相关产品推荐

