You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电脑端Unity可连SignalR Hub,手机端同款Unity无法连接问题排查

问题分析与排查方案

可能的核心原因

  • 安卓网络权限未正确配置
  • SignalR传输协议与安卓Unity环境不兼容
  • Conveyor by Keyoti的转发/证书配置问题
  • IIS的CORS策略未覆盖SignalR请求
  • 服务器与Unity客户端的SignalR版本不匹配
  • 网络层面(防火墙、端口映射)的拦截

分步排查步骤

1. 确认安卓网络权限

  • 检查Unity安卓项目的AndroidManifest.xml,确保包含以下权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    若使用Unity 2020+,可直接在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ı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:28:14