StompClientLib ## 简介
StompClientLib 是一个 Swift 编写的 STOMP 客户端。它使用 Facebook 的 SocketRocket 作为 WebSocket 依赖项。SocketRocket 使用 Objective-C 编写,但 StompClientLib 的 STOMP 部分是使用 Swift 编写的,其用法也是 Swift。您可以在 Swift 5+、4+ 和 3+ 项目中使用此库。
这最初是从 AKStompClient 分支出来的(此库目前无法正常工作)
支持的 Stomp 版本
Stomp 版本
- 1.1
- 1.2
- 可能不支持 1.0(从未测试过)
示例
要运行示例项目,请先克隆仓库,然后在 Example 目录中运行 pod install
。
需求
- 支持 iOS 8.0+
- 支持 XCode 8.1, 8.2, 8.3
- 支持 XCode 9.0+
- 支持 XCode 10.0+
- 支持 XCode 12.1+
- Swift 3.0, 3.1, 3.2
- Swift 4.0, Swift 4.1, Swift 4.2, Swift 5.0
安装
StompClientLib可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
CocoaPods
pod "StompClientLib"
Carthage
github "WrathChaos/StompClientLib"
使用
import StompClientLib
导入后,您可以打开与您的WebSocket服务器的连接。
var socketClient = StompClientLib()
let url = NSURL(string: "your-socket-url-is-here")!
socketClient.openSocketWithURLRequest(request: NSURLRequest(url: url as URL) , delegate: self)
连接后,您需要实现一些代理方法。
StompClientLibDelegate
stompClientDidConnect
func stompClientDidConnect(client: StompClientLib!) {
print("Socket is connected")
// Stomp subscribe will be here!
socketClient.subscribe(destination: topic)
// Note : topic needs to be a String object
}
stompClientDidDisconnect
func stompClientDidDisconnect(client: StompClientLib!) {
print("Socket is Disconnected")
}
didReceiveMessageWithJSONBody ( 通过STOMP接收的消息 )
您的JSON消息将被转换为AnyObject类型的JSON体,您将在该函数中接收到您的消息
func stompClient(client: StompClientLib!, didReceiveMessageWithJSONBody jsonBody: AnyObject?, akaStringBody stringBody: String?, withHeader header: [String : String]?, withDestination destination: String) {
print("Destination : \(destination)")
print("JSON Body : \(String(describing: jsonBody))")
print("String Body : \(stringBody ?? "nil")")
}
didReceiveMessageWithJSONBody ( 作为字符串的通过STOMP接收的消息 )
您的JSON消息将被转换为AnyObject类型的JSON体,您将在该函数中接收到您的消息
func stompClientJSONBody(client: StompClientLib!, didReceiveMessageWithJSONBody jsonBody: String?, withHeader header: [String : String]?, withDestination destination: String) {
print("DESTINATION : \(destination)")
print("String JSON BODY : \(String(describing: jsonBody))")
}
serverDidSendReceipt
如果您要在应用程序中使用STOMP进行内购,您可能需要使用此函数来获取收据
func serverDidSendReceipt(client: StompClientLib!, withReceiptId receiptId: String) {
print("Receipt : \(receiptId)")
}
serverDidSendError
错误消息将在该函数中接收到
func serverDidSendError(client: StompClientLib!, withErrorMessage description: String, detailedErrorMessage message: String?) {
print("Error Send : \(String(describing: message))")
}
serverDidSendPing
如果需要控制服务器的ping,这里是你的部分
func serverDidSendPing() {
print("Server ping")
}
如何订阅和取消订阅
存在订阅和取消订阅的函数。注意:你应该处理你的订阅和取消订阅方法!建议:在"stompClientDidConnect"函数中订阅你的主题,在stompClientWillDisconnect方法中取消订阅你的主题。
订阅
socketClient.subscribe(destination: topic)
// Note : topic needs to be a String object
取消订阅
socketClient.unsubscribe(destination: topic)
重要:你必须为订阅或取消订阅发送你的目的地址!
带有头部的取消订阅
let destination = "/topic/your_topic"
let ack = destination
let id = destination
let header = ["destination": destination, "ack": ack, "id": id]
// subscribe
socketClient?.subscribeWithHeader(destination: destination, withHeader: header)
// unsubscribe
socketClient?.unsubscribe(destination: subsId)
带指定时间自动重连
如果您需要带指定时间自动重连,可以使用这个功能;如果不需要,它将每秒尝试重新连接。
// Reconnect after 4 sec
socketClient.reconnect(request: NSURLRequest(url: url as URL) , delegate: self as StompClientLibDelegate, time: 4.0)
指定时间自动断开连接
// Auto Disconnect after 3 sec
socketClient.autoDisconnect(time: 3)
登录密码实现
这只是一个示例。您需要将其转换为您的实现。 #42
let connectFrame = "CONNECT\n login:admin\n passcode:password\n\n\n\0"
socket.write(string: connectFrame)
未来增强功能
-
完成一个有效示例 -
添加Carthage安装选项 - 添加Swift Package Manager安装选项
-
XCode 9兼容性 -
Swift 4兼容性和测试
变更日志
实施增强功能
- SUBSCRIBE和UNSUBSCRIBE代理缺失 #16
已关闭问题
1.3.8 (2020-03-08)
实施增强功能
- 当我从 ws:// 移动到 wss:// 后,套接字停止工作 #67
- 自签名证书,400错误
修复错误
已关闭问题
- 初始调用中找不到头
- 我关闭了问题,因为它是旧的且可复现的问题
- Spring Boot下stompClientDidConnect没有被调用
- 在Charles Proxy中看不到任何WebSocket流量
- 无法与 Stomp Websocket 连接,当自定义头信息时#64
- 无法将 Socket 连接到 Spring Boot 2.x.x#63
- 多个客户端#48
- IPV6#38
合并的拉取请求
1.3.7 (2019-08-26)
已关闭问题
- 从 Spring boot 收到消息时的问题1.3.6 (2019-08-06)
实施增强功能
- 重构代码并修复对 2.1.x 的支持#65 (baonguyena1)
修复错误
- v1.3.4 替换了打开套接字时的自定义头信息?#58
已关闭问题
- Json 错误:由于数据格式不正确,无法读取数据。#60
合并的拉取请求
1.3.5 (2019-07-25)
修复错误
1.3.4 (2019-07-19)
1.3.3 (2019-07-18)
已关闭问题
合并的拉取请求
- String body 参数和 ':'-in-header-value 修复Erhannis)
1.3.2 (2019-07-10)
实施增强功能
- 缺少 stompClientWillDisconnect1.3.1 (2019-06-14)
已关闭问题
- 我能否用一个 Stomp 客户端订阅多个主题?
- socket?.readyState 是 .OPEN,它永远不会进入我的 "stompClientDidDisconnect" 方法
- 登录、口令
- 使用 Spring boot 时未调用 stompClientDidConnect
1.3.0 (2019-04-30)
实施增强功能
- 使重连无效
- Sec-WebSocket-Accept 的响应无效
- 启用 Assert (self.readyState != SR_CONNECTING)1.2.7 (2018-10-23)
1.2.6 (2018-10-23)
修复错误
1.2.5 (2018-10-22)
已关闭问题
1.2.4 (2018-10-17)
已关闭问题
- 关闭时的代码为 1000,原因:nil1.2.3 (2018-10-17)
实施增强功能
- 如何接收心跳?
- 关闭时的代码为 1002
- 按代码1001关闭,原因: "遇到流结束"#26
- 遇到流结束#17
- 取消订阅socketclient #14
- 无法连接到WebSocket。 #13
- 某个代理方法没有被执行。 #12
- StompClient断开连接。 #10
- 找不到'StompClientLib'的规范 #8
1.2.2 (2017-11-03)
1.2.1 (2017-10-31)
1.2.0 (2017-10-29)
已关闭问题
1.1.7 (2017-10-02)
1.1.6 (2017-08-08)
0.1.5 (2017-07-10)
0.1.4 (2017-07-10)
0.1.3 (2017-07-10)
0.1.2 (2017-07-08)
0.1.1 (2017-07-08)
0.1.0 (2017-07-08)
* 此更新日志由 github_changelog_generator 自动生成
作者
FreakyCoder, [email protected]
许可证
StompClientLib遵循MIT许可证。有关更多信息,请参阅LICENSE文件。
- 关闭时的代码为 1000,原因:nil1.2.3 (2018-10-17)