Swift WebSocket 库:适用于 iOS/macOS 的 Starscream

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

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

开始课程

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

推荐