Starscream — WebSocket 库 for Swift (iOS/macOS)
Starscream 是一个轻量级但功能强大的库,用于在 Apple 平台上处理 WebSocket 协议。它完全用 Swift 编写,没有外部依赖,支持 iOS、macOS、tvOS 和 watchOS。如果您需要在移动应用和服务器之间组织实时双向通信(聊天、通知、在线游戏),Starscream 将是一个绝佳的选择。
主要功能
- 完全支持 RFC 6455 标准 (WebSocket Protocol)。
- 支持安全连接
wss://和普通连接ws://。 - 连接断开时自动重连。
- 支持帧:文本、二进制数据 (Data)、ping/pong。
- 通过 CocoaPods、Swift Package Manager 或 Carthage 轻松集成。
- 兼容 Combine (iOS 13+) 和 Swift Concurrency (async/await)。
通过 Swift Package Manager 安装(推荐)
在 Xcode 中添加包:File → Add Packages,然后粘贴仓库 URL:
https://github.com/daltoniam/Starscream.git选择版本(最新的稳定版)并添加到您的 target。
基本连接示例
创建一个简单的 WebSocket 客户端,连接到服务器并输出接收到的消息。
import Starscream
class WebSocketManager { var socket: WebSocket? func connect() { var request = URLRequest(url: URL(string: "wss://echo.websocket.org")!) request.timeoutInterval = 5 socket = WebSocket(request: request) socket?.delegate = self socket?.connect() }}
extension WebSocketManager: WebSocketDelegate { func didReceive(event: WebSocketEvent, client: WebSocket) { switch event { case .connected(let headers): print("已连接!头信息: \\(headers)") case .disconnected(let reason, let code): print("已断开: \\(reason) (代码: \\(code))") case .text(let string): print("收到文本: \\(string)") case .binary(let data): print("收到二进制数据: \\(data.count) 字节") case .ping(let data): print("Ping: \\(data?.hexString ?? "无数据")") case .pong(let data): print("Pong: \\(data?.hexString ?? "无数据")") case .viabilityChanged(let isViable): print("连接活跃: \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("建议重连: \\(shouldReconnect)") case .cancelled: print("连接已取消") case .error(let error): print("错误: \\(error?.localizedDescription ?? "未知错误")") } }}发送数据
Starscream 允许发送文本字符串和二进制数据。发送 JSON 的示例:
func sendMessage(text: String) { let message: [String: Any] = [ "type": "chat", "content": text, "timestamp": Int(Date().timeIntervalSince1970) ] if let jsonData = try? JSONSerialization.data(withJSONObject: message, options: []), let jsonString = String(data: jsonData, encoding: .utf8) { socket?.write(string: jsonString) }}
// 发送二进制文件(例如图片)func sendImage(data: Data) { socket?.write(data: data)}使用 Combine (iOS 13+)
对于响应式编程,Starscream 提供了 Publisher:
import Combine
class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req