测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可 | Apache 2 |
发布最后发布 | 2017年9月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✓ |
由 Erik Little 维护。
Starscream 是一个符合 WebSocket (RFC 6455) 客户端库,用于 iOS 和 OSX,使用 Swift 语言。
其 Objective-C 对应版本可在以下找到:Jetfire
首先需要导入框架。请查看安装指南了解如何将框架添加到您的项目中。
import Starscream
一旦导入,您就可以打开到您的 WebSocket 服务器的连接。请注意,将 socket
作为属性可能最好,这样就不会在设置好之后就被释放了。
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!)
socket.delegate = self
socket.connect()
连接后,有一些委托方法需要实现。
当客户端连接到服务器时调用 websocketDidConnect。
func websocketDidConnect(socket: WebSocket) {
print("websocket is connected")
}
当客户端从服务器断开连接时调用 websocketDidDisconnect。
func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
print("websocket is disconnected: \(error?.localizedDescription)")
}
当客户端从连接收到文本帧时调用 websocketDidReceiveMessage。
func websocketDidReceiveMessage(socket: WebSocket, text: String) {
print("got some text: \(text)")
}
当客户端从连接收到二进制帧时调用 websocketDidReceiveData。
func websocketDidReceiveData(socket: WebSocket, data: Data) {
print("got some data: \(data.count)")
}
当客户端从连接收到 pong 响应时调用 websocketDidReceivePong。您需要实现 WebSocketPongDelegate 协议并设置额外的委托,例如:socket.pongDelegate = self
func websocketDidReceivePong(socket: WebSocket, data: Data?) {
print("Got pong! Maybe some data: \(data?.count)")
}
或者您可以使用闭包。
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!)
//websocketDidConnect
socket.onConnect = {
print("websocket is connected")
}
//websocketDidDisconnect
socket.onDisconnect = { (error: NSError?) in
print("websocket is disconnected: \(error?.localizedDescription)")
}
//websocketDidReceiveMessage
socket.onText = { (text: String) in
print("got some text: \(text)")
}
//websocketDidReceiveData
socket.onData = { (data: Data) in
print("got some data: \(data.count)")
}
//you could do onPong as well.
socket.connect()
还有一个功能:您可以通过通知监听套接字连接和断开。Starscream 发布 WebsocketDidConnectNotification
和 WebsocketDidDisconnectNotification
通知。您可以通过访问通知的 userInfo
中的 WebsocketDisconnectionErrorKeyName
来找到导致断开连接的 NSError
。
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!
writePing 方法与 write 相同,但它发送一个 ping 控制帧。
socket.write(ping: Data()) //example on how to write a ping control frame over the socket!
disconnect 方法按您预期的效果操作并关闭套接字。
socket.disconnect()
返回套接字是否已连接。
if socket.isConnected {
// do cool stuff.
}
您还可以按如下方式覆盖默认的 Websocket 首部,使用自己的自定义首部
socket.headers["Sec-WebSocket-Protocol"] = "someother protocols"
socket.headers["Sec-WebSocket-Version"] = "14"
socket.headers["My-Awesome-Header"] = "Everything is Awesome!"
您的服务器在连接到 Websocket 时可能使用不同的 HTTP 方法
socket.httpMethod = .post
您可以使用自定义字符串
socket.httpMethod = .custom(value: "mycustomhttpmethod")
如果需要指定协议,简单地在初始化时添加即可
//chat and superchat are the example protocols here
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!, protocols: ["chat","superchat"])
socket.delegate = self
socket.connect()
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!, protocols: ["chat","superchat"])
//set this if you want to ignore SSL cert validation, so a self signed SSL certificate can be used.
socket.disableSSLCertValidation = true
Starscream 也支持 SSL 锁定。
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!, protocols: ["chat","superchat"])
let data = ... //load your certificate from disk
socket.security = SSLSecurity(certs: [SSLCert(data: data)], usePublicKeys: true)
//socket.security = SSLSecurity() //uses the .cer files in your app's bundle
您可以根据证书或使用SecKeyRef
加载证书(如果您有一个希望使用的公钥)。布尔值 usePublicKeys
用于决定是否使用证书进行验证或使用公钥。如果选择 usePublicKeys
,将自动从证书中提取公钥。
要使用 SSL 加密连接,您需要告诉 Starscream 服务器支持的密码套件。
socket = WebSocket(url: URL(string: "wss://127.0.0.1:8080/")!, protocols: ["chat","superchat"])
// Set enabled cipher suites to AES 256 and AES 128
socket.enabledSSLCipherSuites = [TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
如果您不知道您的服务器支持哪些密码套件,您可以将 SSL Labs 指向它并检查结果。
Starscream 支持 RFC 7692 中的压缩扩展。压缩默认启用,但只有当服务器也支持时才会使用。您可以通过 .enableCompression
属性启用或禁用压缩。
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!)
socket.enableCompression = false
如果您的应用程序正在传输已压缩的数据、随机数据或其他不可压缩数据,应禁用压缩。
调用代理方法时可以指定自定义队列。默认情况下使用 DispatchQueue.main
,这意味着所有代理方法的调用都在主线程上执行。需要注意的是,所有的WebSocket处理都是在后台线程上完成的,只有修改队列时,才会更改代理方法的调用。实际的处理始终在后台线程上,不会暂停您的应用程序。
socket = WebSocket(url: URL(string: "ws://127.0.0.1:8080/")!, protocols: ["chat","superchat"])
//create a custom queue
socket.callbackQueue = DispatchQueue(label: "com.vluxe.starscream.myapp")
请在示例目录中的 SimpleTest 项目中查看如何设置到 WebSocket 服务器的简单连接。
Starscream 与 iOS 7/OSX 10.9 或更高版本兼容。建议使用 iOS 8/10.10 或更高版本以支持 CocoaPods/framework。要在针对 iOS 7 的项目中使用 Starscream,必须将所有 Swift 文件直接包含到项目中。
首先查看 安装文档 了解如何安装流浪者。
要在创建的流浪者文件所在的目录中安装 Starscream,请运行以下命令。
rogue add https://github.com/daltoniam/starscream
接下来打开 libs
文件夹,并将 Starscream.xcodeproj
添加到您的 Xcode 项目中。完成后,在 "Build Phases" 中在 "Link Binary with Libraries" 阶段添加 Starscream.framework
。请确保将 libs
文件夹添加到您的 .gitignore
文件中。
Swift 包管理器是一个自动分发 Swift 代码的工具,它集成到 swift
编译器中。
设置好 Swift 包后,将 Starscream 添加为依赖项只需将其添加到 Package.swift
中的 dependencies
值即可。
dependencies: [
.Package(url: "https://github.com/daltoniam/Starscream.git", majorVersion: 2)
]
只需获取框架(无论是通过 git 子模块还是其他包管理器)。
将 Starscream.xcodeproj
添加到您的 Xcode 项目中。完成后,在 "Build Phases" 中将 Starscream.framework
添加到 "Link Binary with Libraries" 阶段。
如果您在一个OSX应用程序或实际的iOS设备上运行这个程序,您需要确保将 Starscream.framework
添加到您的应用程序包中。要在 Xcode 中执行此操作,请点击蓝色的项目图标,然后在侧边栏的 "Targets" 下选择应用程序目标。在上面的选项卡栏上,打开 "Build Phases" 选项卡。展开 "Link Binary with Libraries" 组,并添加 Starscream.framework
。点击面板左上角的 + 按钮,并选择 "New Copy Files Phase"。将此新阶段重命名为 "Copy Frameworks",将 "Destination" 设置为 "Frameworks",并分别添加 Starscream.framework
。
高级代理功能与简单代理类似,但提供了有关连接和传入帧的一些附加信息。
socket.advancedDelegate = self
在大多数情况下,您不需要额外的信息,应该使用正常的代理人。
func websocketDidReceiveMessage(socket: WebSocket, text: String, response: WebSocket.WSResponse {
print("got some text: \(text)")
print("First frame for this message arrived on \(response.firstFrame)")
}
func websocketDidReceiveData(socket: WebSocket, data: Date, response: WebSocket.WSResponse) {
print("got some data it long: \(data.count)")
print("A total of \(response.frameCount) frames were used to send this data")
}
当发送HTTP升级请求和响应返回时,会调用这些方法。
func websocketHttpUpgrade(socket: WebSocket, request: CFHTTPMessage) {
print("the http request was sent we can check the raw http if we need to")
}
func websocketHttpUpgrade(socket: WebSocket, response: CFHTTPMessage) {
print("the http response has returned.")
}
Starscream遵循Apache v2许可证。