测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可协议 | MIT |
发布最后发布 | 2017年12月 |
SwiftSwift版本 | 3.0 |
SPM支持SPM | ✗ |
由Manuel维护。
依赖项 | |
Starscream | >= 0 |
PubNub | >= 0 |
SwiftSpinner | >= 0 |
Starscream是一个符合WebSocket协议(RFC 6455
)其Objective-C对应库可以在此找到:Jetfire
首先需要导入框架。请参阅安装说明了解如何将框架添加到您的项目中。
import Starscream
导入后,您可以打开到WebSocket服务器的连接。请注意,将socket
作为一个属性可能是最好的,这样设置之后就不会立即被释放。
socket = WebSocket(url: URL(string: "ws://:8080/")!)
socket.delegate = self
socket.connect()
连接后,有一些需要我们实现的方法。
当客户端连接到服务器时,会立即调用websocketDidConnect。
func websocketDidConnect(socket: WebSocketClient) {
print("websocket is connected")
}
当客户端从服务器断开连接时,会立即调用websocketDidDisconnect。
func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
print("websocket is disconnected: \(error?.localizedDescription)")
}
当客户端从连接中收到文本帧时,会调用websocketDidReceiveMessage。
func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
print("got some text: \(text)")
}
当客户端从连接中收到二进制帧时,会调用websocketDidReceiveData。
func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
print("got some data: \(data.count)")
}
当客户端从连接中获得pong响应时,会调用websocketDidReceivePong。您需要实现WebSocketPongDelegate协议,并设置额外的代理,例如:socket.pongDelegate = self
func websocketDidReceivePong(socket: WebSocketClient, data: Data?) {
print("Got pong! Maybe some data: \(data?.count)")
}
或者您还可以使用闭包。
socket = WebSocket(url: URL(string: "ws://:8080/")!)
//websocketDidConnect
socket.onConnect = {
print("websocket is connected")
}
//websocketDidDisconnect
socket.onDisconnect = { (error: Error?) 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()
还有一个:您可以通过通知来监听socket的连接和断开。Starscream发布WebsocketDidConnectNotification
和WebsocketDidDisconnectNotification
。您可以通过访问通知的userInfo
中的WebsocketDisconnectionErrorKeyName
来找到引起断开的错误。
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,正如您期望的那样。
socket.disconnect()
返回套接字是否已连接。
if socket.isConnected {
// do cool stuff.
}
您还可以这样使用您自己的自定义头信息来覆盖默认的WebSocket头信息
var request = URLRequest(url: URL(string: "ws://:8080/")!)
request.timeoutInterval = 5
request.setValue("someother protocols", forHTTPHeaderField: "Sec-WebSocket-Protocol")
request.setValue("14", forHTTPHeaderField: "Sec-WebSocket-Version")
request.setValue("Everything is Awesome!", forHTTPHeaderField: "My-Awesome-Header")
let socket = WebSocket(request: request)
您的服务器在连接到WebSocket时可能使用不同的HTTP方法。
var request = URLRequest(url: URL(string: "ws://:8080/")!)
request.httpMethod = "POST"
request.timeoutInterval = 5
let socket = WebSocket(request: request)
如果需要指定一个协议,只需将其添加到初始化中即可。
//chat and superchat are the example protocols here
socket = WebSocket(url: URL(string: "ws://:8080/")!, protocols: ["chat","superchat"])
socket.delegate = self
socket.connect()
socket = WebSocket(url: URL(string: "ws://: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://: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
您可以加载包含您的证书的Data
数据块,或者如果您有一个想使用的公钥,也可以使用SecKeyRef
。布尔值usePublicKeys
表示是否使用证书进行验证或公钥。如果选择了usePublicKeys
,将自动从证书中提取公钥。
要使用SSL加密连接,您需要告诉Starscream您的服务器支持的加密套件。
socket = WebSocket(url: URL(string: "wss://: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指向它,并检查结果。
压缩扩展(《RFC 7692》)在Starscream中得到支持。默认情况下启用压缩,但如果服务器也支持,则会使用压缩。您可以通过.enableCompression
属性启用或禁用压缩。
socket = WebSocket(url: URL(string: "ws://:8080/")!)
socket.enableCompression = false
如果您的应用程序正在传输已经压缩的、随机的或其他不可压缩的数据,则应禁用压缩。
在调用委托方法时可以指定自定义队列。默认情况下使用DispatchQueue.main
,因此所有委托方法调用都在主线程上运行。需要注意的是,所有WebSocket处理都是在后台线程上完成的,只有当修改队列时才更改委托方法调用。实际的执行总是在后台线程上,不会暂停您的应用程序。
socket = WebSocket(url: URL(string: "ws://:8080/")!, protocols: ["chat","superchat"])
//create a custom queue
socket.callbackQueue = DispatchQueue(label: "com.vluxe.starscream.myapp")
请查看examples目录中的SimpleTest项目,了解如何设置简单的WebSocket服务器连接。
Starscream与iOS 7/OSX 10.9或更高版本兼容。建议使用iOS 8/10.10或更高版本以支持CocoaPods/框架。要使用Starscream与针对iOS 7的项目的项目,必须直接将所有Swift文件包含到您的项目中。
请查看cocoapods.org的“入门”标签。
要在项目中使用Starscream,请将以下'Podfile'添加到您的项目中
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
pod 'Starscream', '~> 3.0.2'
然后运行
pod install
查看Carthage文档,以了解如何添加安装。已经配置了共享方案。
您可以使用以下命令通过Homebrew安装Carthage
$ brew update
$ brew install carthage
要使用Carthage将Starscream集成到您的Xcode项目中,请在您的Cartfile
中指定它
github "daltoniam/Starscream" >= 3.0.2
首先查看安装文档以了解如何安装Rogue。
在创建rogue文件所在的目录中运行以下命令以安装Starscream
rogue add https://github.com/daltoniam/Starscream
接下来打开libs
文件夹,将Starscream.xcodeproj
添加到您的Xcode项目中。完成此操作后,在“构建阶段”中,将Starscream.framework
添加到“链接二进制与库”阶段。请确保将libs
文件夹添加到您的.gitignore
文件中。
Swift包管理器是用于自动化Swift代码分布的工具,并集成到swift
编译器中。
一旦您设置了Swift包,将Starscream作为依赖项添加就像将其添加到您的Package.swift
的dependencies
值中一样简单。
dependencies: [
.Package(url: "https://github.com/daltoniam/Starscream.git", majorVersion: 3)
]
简单地获取框架(无论是通过git子模块还是另一个包管理器)。
将Starscream.xcodeproj
添加到您的Xcode项目中。完成后,在您的“构建阶段”中,将Starscream.framework
添加到“与二进制链接的库”阶段。
如果在OSX应用程序或物理iOS设备上运行此应用程序,您需要确保将Starscream.framework
添加到应用程序包中。为此,在Xcode中,通过单击蓝色项目图标并选择侧边栏中的“目标”标题下的应用程序目标,导航到目标配置窗口。在窗口顶部的标签栏中,打开“构建阶段”面板。展开“与二进制链接的库”组,并添加Starscream.framework
。单击面板左上角的加号按钮,选择“新建拷贝文件阶段”。将此新阶段重命名为“拷贝框架”,并将“目标位置”设置为“框架”,然后分别添加Starscream.framework
。
高级代理功能与简单的代理类似,但提供有关连接和传入帧的一些额外信息。
socket.advancedDelegate = self
在大多数情况下,您不需要额外的信息,应该使用常规代理。
func websocketDidReceiveMessage(socket: WebSocketClient, text: String, response: WebSocket.WSResponse {
print("got some text: \(text)")
print("First frame for this message arrived on \(response.firstFrame)")
}
func websocketDidReceiveData(socket: WebSocketClient, 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: WebSocketClient, request: CFHTTPMessage) {
print("the http request was sent we can check the raw http if we need to")
}
func websocketHttpUpgrade(socket: WebSocketClient, response: CFHTTPMessage) {
print("the http response has returned.")
}
SSLCiphers
、disableSSLCertValidation
或SSL固定。在watchOS上设置的所有这些值都将没有任何作用。SSLCiphers
。Starscream采用Apache v2许可证授权。