WebSocket 在 Swift 中:适用于 iOS/macOS 的高级实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

WebSocket 在 Swift 中:创建高级实时应用

\n

在现代移动开发中,实时交互已不仅仅是一个亮点,而是一种必需品。金融报价、在线游戏、即时通讯工具、文档协同编辑——所有这些都需要在客户端和服务器之间即时传输数据。在 Apple 生态系统中,Swift 和 Foundation 框架提供了强大的工具来处理 WebSocket 协议。在本文中,我们将探讨高级技术:从原生的 URLSessionWebSocketTask 到自定义错误处理、多线程和性能优化。

\n\n

1. 通过 URLSessionWebSocketTask 实现原生 WebSocket(iOS 13+)

\n

从 iOS 13 开始,Apple 通过 URLSessionWebSocketTask 提供了对 WebSocket 的内置支持。这是首选方式,因为它不需要第三方依赖,并且与连接管理系统深度集成。

\n\n

1.1. 创建和配置会话

\n

首先,我们创建一个支持自动重连和线程池的 WebSocket 管理器:

\n
import 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\n

1.2. 带类型化的高级消息处理

\n

创建一个用于消息类型的枚举并实现解析:

\n
enum 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\n

2. 多线程与性能的高级处理

\n

实时应用需要高性能。让我们来看一些关键的优化措施。

\n\n

2.1. 线程安全的消息队列

\n
class ThreadSafeMessageQueue {\n    private var queue = [WebSocketMessage]()\n                

博客

书籍推荐