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

Swift4中如何通过Socket.io发送事件?用户加入聊天室时触发事件

实现用户加入聊天室时发送SocketIO事件的方案

首先,我帮你完善SocketIOManager的代码逻辑,确保Socket连接配置正确,同时封装专门的方法来发送「加入聊天室」的事件,再说明如何在ViewController里调用这些能力。

第一步:完善SocketIOManager类

先修复你代码里的语法问题,同时优化连接逻辑和事件发送的封装:

import SocketIO

class SocketIOManager: NSObject {
    // 用单例模式确保全局只有一个Socket连接实例
    static let shared = SocketIOManager()
    
    private let manager: SocketManager
    private let socket: SocketIOClient
    
    private override init() {
        // 初始化基础Socket配置
        guard let url = URL(string: "https://myurl.com:443") else {
            fatalError("无效的Socket服务器地址")
        }
        manager = SocketManager(socketURL: url, config: [.log(true), .compress, .secure(true)])
        socket = manager.defaultSocket
        
        super.init()
        setupConnectionListeners()
    }
    
    // 监听Socket连接状态,方便调试和异常处理
    private func setupConnectionListeners() {
        socket.on(clientEvent: .connect) { _, _ in
            print("Socket连接成功✅")
        }
        
        socket.on(clientEvent: .disconnect) { _, _ in
            print("Socket连接断开❌")
        }
        
        socket.on(clientEvent: .error) { data, _ in
            print("Socket连接出错: \(data)")
        }
    }
    
    // 带token参数连接Socket
    func connect(with token: String) {
        // 更新连接参数
        manager.config = SocketIOClientConfiguration(arrayLiteral:
            .connectParams(["token": token]),
            .secure(true),
            .log(true),
            .compress
        )
        socket.connect()
    }
    
    // 断开Socket连接
    func disconnect() {
        socket.disconnect()
    }
    
    // 发送「加入聊天室」事件,参数可根据后端需求调整
    func sendJoinChatEvent(roomId: String, userId: String) {
        // 确保Socket处于连接状态再发送事件
        guard socket.status == .connected else {
            print("Socket未连接,无法发送加入事件")
            return
        }
        // 这里假设后端监听的事件名为"join_chat_room",参数按需传递
        socket.emit("join_chat_room", ["room_id": roomId, "user_id": userId])
        
        // 如果需要等待后端响应,可改用emitWithAck:
        // socket.emitWithAck("join_chat_room", ["room_id": roomId, "user_id": userId]).timingOut(after: 5) { response in
        //     print("后端确认加入聊天室: \(response)")
        // }
    }
}

这里的关键优化点:

  • 使用单例模式替代静态属性,避免多实例导致的重复连接问题
  • 拆分连接配置和状态监听,逻辑更清晰
  • 封装专门的事件发送方法,增加连接状态校验,避免无效发送

第二步:在ViewController中调用

假设你在ViewController里有触发「加入聊天室」的操作(比如按钮点击),可以这样调用:

import UIKit

class ViewController: UIViewController {
    // 假设已获取到用户token、目标聊天室ID、当前用户ID
    private let userToken = "your_user_token"
    private let targetRoomId = "chat_room_001"
    private let currentUserId = "user_10086"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 页面加载时先建立Socket连接
        SocketIOManager.shared.connect(with: userToken)
    }
    
    // 加入聊天室按钮的点击事件
    @IBAction func joinChatButtonTapped(_ sender: UIButton) {
        SocketIOManager.shared.sendJoinChatEvent(roomId: targetRoomId, userId: currentUserId)
        print("已发送加入聊天室请求")
    }
    
    deinit {
        // 页面销毁时断开Socket连接(根据业务需求选择是否保留)
        SocketIOManager.shared.disconnect()
    }
}

注意事项

  • 确保后端已经配置好对应事件(比如join_chat_room)的监听逻辑,能正确解析你传递的参数
  • 生产环境建议关闭Socket日志(把.log(true)改为.log(false)),避免泄露敏感信息
  • 如果需要处理加入聊天室的结果反馈,优先使用emitWithAck方法接收后端响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:23:08