Swift(iOS/macOS)的 WebSocket 库:Starscream 和 URLSessionWebSocketTask
WebSocket 是一种通过单个 TCP 连接在客户端和服务器之间提供全双工通信的协议。在 Swift(iOS/macOS)生态系统中,有两种主要方法可用于处理 WebSocket:原生实现 URLSessionWebSocketTask(自 iOS 13/macOS 10.15 起可用)和流行的第三方库 Starscream。两者都允许创建实时响应式应用程序:聊天、行情推送、多人游戏等。
原生实现 URLSessionWebSocketTask
随着 iOS 13 的发布,Apple 在 Foundation 框架中添加了内置的 WebSocket 支持。如果您的应用程序面向现代操作系统版本,这可以省去引入第三方依赖项的需要。
主要功能:
- 通过
async/await或回调实现完全异步操作 - 自动管理连接生命周期
- 支持
closeCode、closeReason以实现正确关闭 - 与
URLSession的内置集成(支持超时、缓存策略)
连接和发送消息示例:
import Foundation
class WebSocketManager { private var webSocketTask: URLSessionWebSocketTask? private let session = URLSession.shared func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() receiveMessage() } func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("发送错误:\\(error.localizedDescription)") } } } private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): print("收到:\\(text)") case .data(let data): print("收到二进制数据:\\(data)") @unknown default: fatalError() } // 继续监听 self?.receiveMessage() case .failure(let error): print("接收错误:\\(error)") // 可能需要重新连接 } } } func disconnect() { webSocketTask?.cancel(with: .normalClosure, reason: nil) }}Starscream — 灵活且经过验证的库
Starscream 是一个用于 Swift 的开源 WebSocket 库,由 Dalton Cherry 编写并由社区维护。它适用于 iOS、macOS、tvOS 和 watchOS,从较旧的版本(iOS 8+)开始。Starscream 提供对连接的更多控制,并支持附加功能,例如压缩(permessage-deflate)和自定义标头。
通过 Swift Package Manager 安装:
// 在 Package.swift 中或通过 Xcode:File → Swift Packages → Add Package Dependency.package(url: "https://github.com/daltoniam/Starscream.git", from: "4.0.0")主要功能:
- 支持
WebSocketDelegate处理所有事件(连接、数据接收、错误、断开连接) - 手动管理 ping/pong 以保持连接
- 能够发送二进制数据(Data)和字符串(String/UTF-8)
- 支持 SSL/TLS 和自签名证书