Starscream 4.0.8

Starscream 4.0.8

测试已测试
Lang语言 SwiftSwift
许可证 Apache-2.0
发布最后发布Mar 2024
SPM支持SPM

由以下人员维护:Dalton CherryKristaps GrinbergsAustin Cherry



starscream

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框架已经配置了共享方案。

Carthage安装

您可以使用以下命令通过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许可协议。

联系

Dalton Cherry

Austin Cherry