BittyBird
BittyBird 是一个用于与 Phoenix Channels 交互的 Swift 客户端库。它默认使用 JSON 进行序列化,但也包括一个用于编码和解码消息的二进制到二进制的 MessagePack 序列化器。查看这篇博客文章,了解如何设置您的 Phoenix 应用以使用 MessagePack 进行序列化:如何设置您的 Phoenix 应用以使用 MessagePack 进行序列化。
安装
BittyBird 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'BittyBird', '~> 0.1.4'
需求
BittyBird是用 Swift 4.1.2 编写的,用于连接到版本 >=1.3 的 Phoenix 应用,目标设备为 iOS 8.0 及以上。它的依赖项包括 SwiftMsgPack,它会用它进行 MessagePack 序列化,以及 Starscream,一个 Swift WebSocket 库。
使用方法
创建套接字的示例
// Production
let socket = Socket(endPoint: "wss://yoursite.com/socket/websocket")
// Development
let socket = Socket(endPoint: "ws://:4000/socket/websocket")
// Use MessagePack for serialization
let socketOptions = SocketOptions(serializer: MsgPackSerializer())
let socket = Socket(endPoint: "wss://yoursite.com/socket/websocket", opts: socketOptions)
// More Options - All SocketOptions parameters are optional
let socketOptions = SocketOptions(
timeout: 15, heartbeatIntervalSeconds: 60,
reconnectAfterSeconds: { (tries: Int) -> Int in return 100 },
logger: { (kind: String, msg: String, data: Any?) in
print("kind: \(kind), msg: \(msg), data: \(data)")
},
params: ["customParamKey": "customParamValue"],
serializer: CustomSerializer() // Any class that conforms to Serializer protocol will work
)
let socket = Socket(endPoint: "wss://yoursite.com/socket/websocket", opts: socketOptions)
创建和加入频道的示例
// Creating a channel without parameters
let channel = socket.channel(topic: "room:lobby")
// Creating a channel with parameters, passed to Phoenix channel's join function
let channel = socket.channel(topic: "room:lobby", chanParams: ["customParam": "customValue"])
// Joining a channel
channel.join()
.receive(status: "ok") { (msg) in /* handle successful join */ }
.receive(status: "error") { (errorMsg) in /* handle error */ }
.receive(status: "timeout") { (_) in /* handle timeout */ }
推送和处理事件示例
// Handling events
channel.on(event: "someEvent") { (msg) in
/* Handle "someEvent" message, probably doing something with msg.payload */
}
// Pushing messages
channel.push(event: "somePushEvent", payload: ["aKey": "aValue", "anotherKey": "anotherValue"])
// Pushing messages and optionally receiving replys
channel.push(event: "somePushEvent", payload: ["aKey": "aValue"])
.receive(status: "ok") { (msg) in /* handle push reply */ }
.receive(status: "error") { (errorMsg) in /* handle push error */ }
.receive(status: "timeout") { (_) in /* handle push timeout */ }
关于
BittyBird 的主要目标是尽可能接近 Phoenix JS 客户端。我还努力让它尽可能地可定制。这意味着几乎所有的类和函数都是开放的,所以如果你想要的话,你可以用你自己的实现来覆盖它们。但要小心。
与 Phoenix JS 客户端显著不同的 API
- 所有参数都是命名参数
- 使用
BBTimer
而不是Timer
- 使用
Socket.socketProtocol
而不是Socket.protocol
- 使用
Socket.heartbeatIntervalSeconds
而不是Socket.heartbeatIntervalMs
- 使用
Socket.reconnectAfterSeconds
而不是Socket.reconnectAfterMs
skipHeartbeat
是Socket
的属性,而不是Socket.connection
的属性- 没有
Socket.connectionState
方法。Starscream 目前还不支持这个。 - Phoenix JS 客户端将消息传递为一个具有
topic
、payload
等属性的通用数据对象,或者作为单独的参数传递,例如Channel.isMemeber
方法。BittyBird 通过传递一个Message
类型的实例来替换这两种模式。 Channel.init
接受一个可选的pushClass
参数,该参数默认为Push.self
。在此用作添加依赖注入以进行测试的方式,但您可以用任何 Push 子类实现通过此参数进行更换。如果 Swift 以后为泛型适应默认值,我可能在未来版本中删除此参数。
作者
BittyBird 是由 Nick Eneboe 编写的。感谢 SwiftPhoenixClient,本仓库从中借鉴了很多东西。同时感谢 phoenix.js 的 API 设计,这是来自 Phoenix 框架的贡献者。
开发
为在您的机器上设置 BittyBird 进行开发
- 克隆仓库
- 在终端中,cd 到 BittyBird/Example 目录
- 运行
pod install
- 在 Xcode 中打开 BittyBird/Example/BittyBird.xcworkspace
- 按 ⌘+U 运行测试并确保所有测试通过。
许可协议
BittyBird 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。