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
相关产品推荐
相关产品推荐

