spiker 1.0.7

spiker 1.0.7

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布最后发布2017年12月
SwiftSwift版本3.0
SPM支持SPM

Manuel维护。



 
依赖项
Starscream>= 0
PubNub>= 0
SwiftSpinner>= 0
 

spiker 1.0.7

  • 作者:
  • Manuel Vrhovac

starscream

Starscream是一个符合WebSocket协议(RFC 6455

其Objective-C对应库可以在此找到:Jetfire

功能

  • 符合所有基本Autobahn测试套件
  • 非阻塞。所有操作都在后台完成,归功于GCD。
  • 支持TLS/WSS。
  • 支持压缩扩展(RFC 7692

  • 代码库简洁,只有几百行代码。

示例

首先需要导入框架。请参阅安装说明了解如何将框架添加到您的项目中。

import Starscream

导入后,您可以打开到WebSocket服务器的连接。请注意,将socket作为一个属性可能是最好的,这样设置之后就不会立即被释放。

socket = WebSocket(url: URL(string: "ws://:8080/")!)
socket.delegate = self
socket.connect()

连接后,有一些需要我们实现的方法。

websocketDidConnect

当客户端连接到服务器时,会立即调用websocketDidConnect。

func websocketDidConnect(socket: WebSocketClient) {
    print("websocket is connected")
}

websocketDidDisconnect

当客户端从服务器断开连接时,会立即调用websocketDidDisconnect。

func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
	print("websocket is disconnected: \(error?.localizedDescription)")
}

websocketDidReceiveMessage

当客户端从连接中收到文本帧时,会调用websocketDidReceiveMessage。

func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
	print("got some text: \(text)")
}

websocketDidReceiveData

当客户端从连接中收到二进制帧时,会调用websocketDidReceiveData。

func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
	print("got some data: \(data.count)")
}

可选:(需要协议:WebSocketPongDelegate)websocketDidReceivePong

当客户端从连接中获得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发布WebsocketDidConnectNotificationWebsocketDidDisconnectNotification。您可以通过访问通知的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!

写入ping帧

writePing方法与write相同,但发送ping控制帧。

socket.write(ping: Data()) //example on how to write a ping control frame over the socket!

断开

disconnect方法会关闭socket,正如您期望的那样。

socket.disconnect()

isConnected

返回套接字是否已连接。

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)

自定义HTTP方法

您的服务器在连接到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()

自签名SSL

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

SSL固定

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加密套件

要使用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

请查看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

查看Carthage文档,以了解如何添加安装。已经配置了共享方案。

Carthage安装

您可以使用以下命令通过Homebrew安装Carthage

$ brew update
$ brew install carthage

要使用Carthage将Starscream集成到您的Xcode项目中,请在您的Cartfile中指定它

github "daltoniam/Starscream" >= 3.0.2

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.swiftdependencies值中一样简单。

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

WebSocketAdvancedDelegate

高级代理功能与简单的代理类似,但提供有关连接和传入帧的一些额外信息。

socket.advancedDelegate = self

在大多数情况下,您不需要额外的信息,应该使用常规代理。

websocketDidReceiveMessage

func websocketDidReceiveMessage(socket: WebSocketClient, text: String, response: WebSocket.WSResponse {
	print("got some text: \(text)")
	print("First frame for this message arrived on \(response.firstFrame)")
}

websocketDidReceiveData

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")
}

websocketHttpUpgrade

当发送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.")
}

已知问题

  • watchOS没有修改流SSL行为的CFNetwork字符串常量。它将采用默认的Foundation SSL行为。这意味着watchOS无法使用SSLCiphersdisableSSLCertValidation或SSL固定。在watchOS上设置的所有这些值都将没有任何作用。
  • Linux没有安全框架,所以它也无法使用SSL固定或SSLCiphers

待办事项

  • 添加单元测试 - 运行在Autobahn上对本地WebSocket服务器的测试

许可协议

Starscream采用Apache v2许可证授权。

联系

Dalton Cherry

Austin Cherry