SwiftCentrifuge is a Websocket client for Centrifugo and Centrifuge library. This client uses Protobuf protocol for client-server communication.
SwiftCentrifuge runs all operations in its own queues and provides necessary callbacks so you don't need to worry about managing concurrency yourself.
This library is feature rich and supports almost all available Centrifuge/Centrifugo features (see matrix below). But it's very young and not tested in production application yet. Any help and feedback is very appreciated to make it production ready and update library status. Any report will give us an understanding that the library works, is useful and we should continue developing it. Please share your stories.
There are several convenient ways.
To integrate SwiftCentrifuge into your Xcode project using CocoaPods, specify it in your Podfile
:
pod 'SwiftCentrifuge'
Add the line github "centrifugal/centrifuge-swift"
to your Cartfile
. Then run carthage update
.
SwiftCentrifuge is compatible with SPM. If you get a warning complaining about missing pc file, you may need to install pkg-config
. On macOS, this can be achieved with brew install pkg-config
.
Clone the repo and drag files from Sources
folder into your Xcode project.
This library depends on SwiftProtobuf
An example app is included demonstrating basic client functionality.
Connect to server based on Centrifuge library:
import SwiftCentrifuge
class ClientDelegate : NSObject, CentrifugeClientDelegate {
func onConnect(_ client: CentrifugeClient, _ e: CentrifugeConnectEvent) {
print("connected with id", e.client)
}
func onDisconnect(_ client: CentrifugeClient, _ e: CentrifugeDisconnectEvent) {
print("disconnected", e.reason, "reconnect", e.reconnect)
}
}
let config = CentrifugeClientConfig()
let url = "ws://127.0.0.1:8000/connection/websocket?format=protobuf"
let client = CentrifugeClient(url: url, config: config, delegate: ClientDelegate())
client.connect()
Note that you must use ?format=protobuf
in connection URL as this client communicates with Centrifugo/Centrifuge over Protobuf protocol. While this client uses Protobuf binary protocol nothing stops you from sending JSON-encoded data over it.
To connect to Centrifugo you need to additionally set connection JWT:
...
let client = CentrifugeClient(url: url, config: config, delegate: ClientDelegate())
client.setToken("YOUR CONNECTION JWT")
client.connect()
Now let's look at how to subscribe to channel and listen to messages published into it:
import SwiftCentrifuge
class ClientDelegate : NSObject, CentrifugeClientDelegate {
func onConnect(_ client: CentrifugeClient, _ e: CentrifugeConnectEvent) {
print("connected with id", e.client)
}
func onDisconnect(_ client: CentrifugeClient, _ e: CentrifugeDisconnectEvent) {
print("disconnected", e.reason, "reconnect", e.reconnect)
}
}
class SubscriptionDelegate : NSObject, CentrifugeSubscriptionDelegate {
func onPublish(_ s: CentrifugeSubscription, _ e: CentrifugePublishEvent) {
let data = String(data: e.data, encoding: .utf8) ?? ""
print("message from channel", s.channel, data)
}
}
let config = CentrifugeClientConfig()
let url = "ws://127.0.0.1:8000/connection/websocket?format=protobuf"
let client = CentrifugeClient(url: url, config: config, delegate: ClientDelegate())
client.connect()
do {
let sub = try client.newSubscription(channel: "example", delegate: SubscriptionDelegate())
sub.subscribe()
} catch {
print("Can not create subscription: \(error)")
}
When a mobile application goes to the background there are OS-specific limitations for established persistent connections - which can be silently closed shortly. Thus in most cases you need to disconnect from a server when app moves to the background and connect again when app goes to the foreground.
Bump version in SwiftCentrifuge.podspec
Push to master and create new version tag.
Then run:
pod trunk push SwiftCentrifuge.podspec
SwiftCentrifuge is available under the MIT license. See LICENSE for details.
link |
Stars: 42 |
Last commit: 4 days ago |
CentrifugeConnectEvent
#67Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics