WebSocket 在 Swift 中:创建高级实时应用
\n在现代移动开发中,实时交互已不仅仅是一个亮点,而是一种必需品。金融报价、在线游戏、即时通讯工具、文档协同编辑——所有这些都需要在客户端和服务器之间即时传输数据。在 Apple 生态系统中,Swift 和 Foundation 框架提供了强大的工具来处理 WebSocket 协议。在本文中,我们将探讨高级技术:从原生的 URLSessionWebSocketTask 到自定义错误处理、多线程和性能优化。
1. 通过 URLSessionWebSocketTask 实现原生 WebSocket(iOS 13+)
\n从 iOS 13 开始,Apple 通过 URLSessionWebSocketTask 提供了对 WebSocket 的内置支持。这是首选方式,因为它不需要第三方依赖,并且与连接管理系统深度集成。
1.1. 创建和配置会话
\n首先,我们创建一个支持自动重连和线程池的 WebSocket 管理器:
\nimport Foundation\n\nclass WebSocketManager: NSObject {\n private var webSocketTask: URLSessionWebSocketTask?\n private var session: URLSession!\n private let queue = DispatchQueue(label: "com.websocket.queue", qos: .userInitiated)\n private var isConnected = false\n \n override init() {\n super.init()\n let config = URLSessionConfiguration.default\n config.waitsForConnectivity = true\n config.timeoutIntervalForResource = 300\n session = URLSession(configuration: config, delegate: self, delegateQueue: nil)\n }\n \n func connect(url: URL) {\n webSocketTask = session.webSocketTask(with: url)\n webSocketTask?.resume()\n receiveMessage()\n }\n \n func disconnect() {\n webSocketTask?.cancel(with: .normalClosure, reason: nil)\n isConnected = false\n }\n}\n\n1.2. 带类型化的高级消息处理
\n创建一个用于消息类型的枚举并实现解析:
\nenum WebSocketMessage {\n case text(String)\n case data(Data)\n case ping\n case pong\n case error(Error)\n}\n\nextension WebSocketManager: URLSessionWebSocketDelegate {\n func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {\n isConnected = true\n print("WebSocket connected")\n }\n \n func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {\n isConnected = false\n print("WebSocket closed: \\(closeCode)")\n // 5 秒后自动重连\n DispatchQueue.global().asyncAfter(deadline: .now() + 5) { [weak self] in\n self?.reconnect()\n }\n }\n \n private func receiveMessage() {\n webSocketTask?.receive { [weak self] result in\n switch result {\n case .success(let message):\n self?.handleMessage(message)\n self?.receiveMessage() // 循环接收\n case .failure(let error):\n self?.handleError(error)\n }\n }\n }\n \n private func handleMessage(_ message: URLSessionWebSocketTask.Message) {\n switch message {\n case .string(let text):\n processText(text)\n case .data(let data):\n processData(data)\n @unknown default:\n break\n }\n }\n}\n\n2. 多线程与性能的高级处理
\n实时应用需要高性能。让我们来看一些关键的优化措施。
\n\n2.1. 线程安全的消息队列
\nclass ThreadSafeMessageQueue {\n private var queue = [WebSocketMessage]()\n