Starscream 是一个遵从 WebSocket (RFC 6455) 的 Swift 库。
功能
- 遵从所有基本的 Autobahn 测试套件。
- 非阻塞。所有操作都在后台完成,归功于 GCD。
- TLS/WSS 支持。
- 压缩扩展支持 (RFC 7692)
导入框架
首先,需要导入框架。有关如何将框架添加到项目的安装说明中。
import Starscream
连接到 WebSocket 服务器
导入后,您就可以打开一个连接到您的 WebSocket 服务器。注意,将 socket
作为属性可能是最好的选择,这样它就不会在设置之后立即被解除分配。
var request = URLRequest(url: URL(string: "http://localhost:8080")!)
request.timeoutInterval = 5
socket = WebSocket(request: request)
socket.delegate = self
socket.connect()
连接后,您可以使用代理或闭包来处理 WebSocket 事件。
从WebSocket接收数据
didReceive
在一个易于处理的枚举中接收所有的WebSocket事件。
func didReceive(event: WebSocketEvent, client: WebSocket) {
switch event {
case .connected(let headers):
isConnected = true
print("websocket is connected: \(headers)")
case .disconnected(let reason, let code):
isConnected = false
print("websocket is disconnected: \(reason) with code: \(code)")
case .text(let string):
print("Received text: \(string)")
case .binary(let data):
print("Received data: \(data.count)")
case .ping(_):
break
case .pong(_):
break
case .viabilityChanged(_):
break
case .reconnectSuggested(_):
break
case .cancelled:
isConnected = false
case .error(let error):
isConnected = false
handleError(error)
}
}
它的关闭方式为
socket.onEvent = { event in
switch event {
// handle events just like above...
}
}
向WebSocket写入
写入二进制帧
writeData方法提供了一个简单的方式来向服务器发送Data
(二进制)数据。
socket.write(data: data) //write some Data over the socket!
写入字符串帧
writeString方法和writeData方法相同,但发送的是文本/字符串。
socket.write(string: "Hi Server!") //example on how to write text over the socket!
写入ping帧
writePing方法和write方法相同,但发送的是ping控制帧。
socket.write(ping: Data()) //example on how to write a ping control frame over the socket!
写入pong帧
writePong方法和writePing方法相同,但发送的是pond控制帧。
socket.write(pong: Data()) //example on how to write a pong control frame over the socket!
Starscream将自动响应对传入的ping
控制帧,因此您无需手动发送pong
。
然而,如果由于某些原因需要控制此过程,可以通过禁用 respondToPingWithPong
来关闭自动 ping
反应。
socket.respondToPingWithPong = false //Do not automaticaly respond to incoming pings with pongs.
在大多数情况下,您不需要这样做。
断开连接
断开连接方法会执行您预期的操作,即关闭套接字。
socket.disconnect()
断开连接方法还可以发送自定义的关闭代码,如果需要的话。
socket.disconnect(closeCode: CloseCode.normal.rawValue)
自定义头部、协议和超时
您可以覆盖默认的 WebSocket 头部,添加自己的自定义头部并设置超时。
var request = URLRequest(url: URL(string: "ws://localhost:8080/")!)
request.timeoutInterval = 5 // Sets the timeout for the connection
request.setValue("someother protocols", forHTTPHeaderField: "Sec-WebSocket-Protocol")
request.setValue("14", forHTTPHeaderField: "Sec-WebSocket-Version")
request.setValue("chat,superchat", forHTTPHeaderField: "Sec-WebSocket-Protocol")
request.setValue("Everything is Awesome!", forHTTPHeaderField: "My-Awesome-Header")
let socket = WebSocket(request: request)
SSL 数据绑定
Starscream 也支持 SSL 数据绑定。
允许自签名证书
var request = URLRequest(url: URL(string: "ws://localhost:8080/")!)
let pinner = FoundationSecurity(allowSelfSigned: true) // don't validate SSL certificates
let socket = WebSocket(request: request, certPinner: pinner)
TODO:更新文档关于如何在应用程序包中加载证书和公钥,使用内置的绑定器和 TrustKit。
压缩扩展
压缩扩展(RFC 7692)在 Starscream 中得到支持。默认启用压缩,但是只有当服务器也支持时才会使用压缩。您可以通过 .enableCompression
属性来启用或禁用压缩。
var request = URLRequest(url: URL(string: "ws://localhost:8080/")!)
let compression = WSCompression()
let socket = WebSocket(request: request, compressionHandler: compression)
如果您的应用程序正在传输已经压缩、随机或其他无法压缩的数据,应禁用压缩。
自定义队列
调用委托方法时可以指定自定义队列。默认情况下使用DispatchQueue.main
,因此所有委托方法的调用都在主线程上运行。需要注意的是,所有WebSocket处理都在后台线程进行,只有在修改队列时才会更改委托方法的调用。实际处理始终在后台线程进行,不会使您的应用暂停。
socket = WebSocket(url: URL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])
//create a custom queue
socket.callbackQueue = DispatchQueue(label: "com.vluxe.starscream.myapp")
示例项目
请查看示例目录中的SimpleTest项目,了解如何设置与WebSocket服务器的简单连接。
需求
Starscream适用于iOS 8/10.10或更高版本的CocoaPods框架支持。要使用Starscream与针对iOS 7的项目,必须直接在项目中包含所有Swift文件。
安装
CocoaPods
请查看cocoapods.org的“开始”标签。
要在项目中使用Starscream,请将以下'Podfile'添加到您的项目
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
pod 'Starscream', '~> 4.0.0'
然后运行
pod install
Carthage
请查看关于如何添加和安装的Carthage文档。 Starscream框架已经配置了共享方案。
您可以使用以下命令通过Homebrew安装Carthage
$ brew update
$ brew install carthage
要使用Carthage将Starscream整合到您的Xcode项目中,请在您的Cartfile中指定它
github "daltoniam/Starscream" >= 4.0.0
Accio
查看Accio文档,了解如何添加安装。
将以下内容添加到您的Package.swift文件中
.package(url: "https://github.com/daltoniam/Starscream.git", .upToNextMajor(from: "4.0.0")),
接下来,按照以下方式将Starscream
添加到您的App目标的依赖中
.target(
name: "App",
dependencies: [
"Starscream",
]
),
然后运行accio update
。
Rogue
首先查看Rogue安装文档了解如何安装Rogue。
在您创建rogue文件所在的目录中运行以下命令来安装Starscream。
rogue add https://github.com/daltoniam/Starscream
接下来,打开libs
文件夹并将Starscream.xcodeproj
添加到您的Xcode项目中。完成后,在“构建阶段”中将Starscream.framework
添加到“链接到二进制库”阶段。请确保将libs
文件夹添加到您的.gitignore
文件中。
Swift包管理器
Swift包管理器是一个用于自动分发Swift代码的工具,且集成在swift
编译器中。
一旦您设置了Swift包,将Starscream作为依赖项添加就像将它添加到您的Package.swift
文件的dependencies
值一样简单。
dependencies: [
.Package(url: "https://github.com/daltoniam/Starscream.git", majorVersion: 4)
]
其他
简单地获取框架(通过git子模块或其他包管理器)。
将Starscream.xcodeproj
添加到您的Xcode项目中。完成后,在“构建阶段”中将Starscream.framework
添加到“链接到二进制库”阶段。
添加复制框架阶段
如果您在OSX应用或物理iOS设备上运行此代码,您需要确保将Starscream.framework
添加到您的应用程序包中。为此,在Xcode中,通过点击左侧栏的蓝色项目图标,然后在“目标”下选择应用程序目标,导航到目标配置窗口。在该窗口顶部的标签栏中,打开“构建阶段”面板。展开“链接二进制与库”组,并添加Starscream.framework
。在面板的左上角单击加号,选择“新复制文件阶段”。将此新阶段重命名为“复制框架”,将“目标”设置为“框架”,并分别添加Starscream.framework
。
TODOs
- 代理支持
许可协议
Starscream遵循Apache v2许可协议。