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

SignalRSwift库.on方法无法接收消息的问题求助

问题:SignalR-Swift无法接收ASP.NET后端推送消息

环境说明

  • 基于适配ASP.NET框架的SignalR-Swift库开发聊天应用
  • 已实现通过API向服务器发送消息,但无法通过.on方法接收后端推送的回复
  • Web端可正常接收相同的后端推送,仅Swift端无响应

Swift端连接与监听代码

hubConnection = HubConnection(withUrl: "https://test.scrm.com")
chat = self.hubConnection.createHubProxy(hubName: "NotificationHub")

_ = chat?.on(eventName:"broadcastMessage") { (args) in
     if let name = args[0] as? String, let id = args[1] as? Int, let message = args[2] as? String {
                print("Name: \(name), VisitorID: \(id), message: \(message)")
            }
 }

hubConnection.started = {
    self.typingLbl.text = "Connected"
}

hubConnection.reconnecting = {
    self.typingLbl.text = "Connected"
    print("Reconnecting...")
}

hubConnection.reconnected = {
    self.typingLbl.text = "Reconnected, connection ID: \(self.hubConnection.connectionId ?? " ")"
    print("Reconnected.")
}

hubConnection.closed = {
    self.typingLbl.text = "Hub Disconnected"
    print("Hub Disconnected")
}

hubConnection.connectionSlow = {
    self.typingLbl.text = "Connection Slow"
    print("Connection slow...") 
}

hubConnection.error = { error in
    let anError = error as NSError
    if anError.code == NSURLErrorTimedOut {
        self.hubConnection.start()
    }
}

hubConnection.start()

Swift端消息发送代码

@objc func sendMessage() {
    if let messageTxt = messageTxtField.text {
       
        self.saveVisitorChat(visitorSessionID: user?.visitorSession.id ?? 0, visitorId: user?.id ?? 1, message: messageTxt)
        
        message.append(messageTxt)
        print("Messages \(message)")
    }
}

后端ASP.NET推送代码

context.Clients.All.broadcastMessage(response.LoggedInUserName, reply.WcVisitorId, reply.ReplyMessage);

Web端正常接收的代码

myHub.client.broadcastMessage = function (name, id, message) {
    debugger
    if (localStorage.getItem("vId") == id) {
        var time = new Date();
        $("#chat-body").append(
            '<div class="chat-message" id="">' +
            '<div class="chat-message-content-w">' +
            ' <div class="chat-message-content" id="server-reply">' +
            '<div class="chatusern"><strong>' + name + '</strong></div>' +
            '<span>' + createTextLinks(message) + '</span>' +
            '<div class="chat-message-date" id="message-time">' +
            '<p>' + time.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true }) + '</p>' +
            '</div>' +
            '</div>' +
            '</div>' +
            '</div>' +
            '</div>');
        $("#testThis").animate({ scrollTop: $(document).height() + 5000000 }, "slow");
        return false;
    }
};

排查解决方向

1. 修复事件名称的特殊字符问题

Swift代码中eventName:"broadcastMessage"包含两个不可见的特殊字符,导致事件名称与后端推送的broadcastMessage不匹配,直接修改为:

_ = chat?.on(eventName:"broadcastMessage") { (args) in
    // ... 原有逻辑
}

2. 确保Hub代理为强引用

将chat声明为类的强引用属性(如var chat: HubProxy?),避免被ARC自动回收,导致监听失效。

3. 验证参数类型与接收情况

在监听回调中先打印所有参数,确认是否收到推送以及参数类型是否匹配:

_ = chat?.on(eventName:"broadcastMessage") { (args) in
    print("Received args: \(args)")
    if let name = args[0] as? String, 
       let id = args[1] as? Int, // 若后端推送的id是字符串,改为as? String
       let message = args[2] as? String {
        print("Name: \(name), VisitorID: \(id), message: \(message)")
    } else {
        print("参数类型不匹配或未收到完整参数")
    }
}

4. 完善错误日志排查

在error回调中打印完整错误信息,便于定位连接或通信问题:

hubConnection.error = { error in
    print("SignalR错误详情: \(error ?? "未知错误")")
    if let anError = error as NSError?, anError.code == NSURLErrorTimedOut {
        self.hubConnection.start()
    }
}

5. 确认Hub名称完全匹配

确保Swift端创建HubProxy的"NotificationHub"与后端Hub类的名称完全一致(大小写敏感),后端Hub类应为:

public class NotificationHub : Hub
{
    // ... 方法逻辑
}

内容的提问来源于stack exchange,提问作者Ahmed Saeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:48:20