Swift 4中如何使用Socket.io建立连接?
Swift中封装Socket.IO连接管理类的实现
我最近查阅了最新的Swift版Socket.io官方文档,里面给出的全新连接示例代码是这样的:
let manager = SocketManager(socketURL: URL(string: "http://localhost:8080")!, config: [.log(true), .compress]) let socket = manager.defaultSocket
基于这个官方示例,我封装了一个SocketIOManager单例类,用来全局统一管理Socket连接,避免多处创建连接的问题,完整的类代码如下:
class SocketIOManager: NSObject { // 初始化SocketManager,注意URL必须包含完整协议(比如https),否则会初始化失败 static let manager = SocketManager(socketURL: URL(string: "https://myurl.com:443")!, config: [.log(true), .compress]) static let socket = manager.defaultSocket /// 建立Socket连接 class func connectSocket(){ socket.connect() // 监听连接成功事件 socket.on(clientEvent: .connect) { _, _ in print("✅ Socket连接成功") } // 监听断开连接事件 socket.on(clientEvent: .disconnect) { _, _ in print("❌ Socket断开连接") } // 监听连接失败事件 socket.on(clientEvent: .connectError) { data, _ in if let error = data.first as? Error { print("⚠️ Socket连接失败: \(error.localizedDescription)") } } } /// 断开Socket连接 class func disconnectSocket() { socket.disconnect() } /// 监听自定义业务事件 class func listenForEvent(_ eventName: String, handler: @escaping ([Any]) -> Void) { socket.on(eventName) { data, _ in handler(data) } } /// 发送自定义业务事件 class func sendEvent(_ eventName: String, with data: Any...) { socket.emit(eventName, with: data) } }
这里有几个需要注意的细节:
- 初始化
SocketManager时,URL必须包含完整的协议头(http或https),不然URL(string:)会返回nil,导致初始化失败。如果不确定URL合法性,建议用可选绑定做安全处理 - 单例模式能保证整个App生命周期内只有一个Socket连接实例,避免重复连接造成的资源浪费
- 可以根据需求扩展配置项,比如重连策略(
.reconnects(true)、.reconnectAttempts(5))、超时时间设置等 - 记得在合适的时机调用
SocketIOManager.connectSocket()(比如App启动后、进入实时通信页面时),不再需要连接时调用SocketIOManager.disconnectSocket()
内容的提问来源于stack exchange,提问作者Nastromo
相关产品推荐
相关产品推荐

