Quickstart: Swift (iOS/macOS)
Build a real-time pub/sub app in 10 minutes.
Prerequisites
- Swift 5.5+
- iOS 15+ / macOS 12+
- RelayX account with API key and secret
Install
Add to your Package.swift:
dependencies: [
.package(url: "https://github.com/Realtime-Relay/Realtime", from: "1.0.0")
]
Or in Xcode: File → Add Packages → Enter the repository URL.
Basic Example
import Realtime
// Create a message listener
class ChatListener: MessageListener {
func onMessage(_ msg: NatsMessage) {
if let data = msg.data as? [String: Any],
let user = data["user"] as? String,
let text = data["text"] as? String {
print("\(user): \(text)")
}
}
}
// Initialize client
let client = try Realtime(
apiKey: "your-api-key",
secret: "your-secret"
)
client.prepare()
Task {
try await client.connect()
// Subscribe to messages
client.on(topic: "chat.room1", listener: ChatListener())
// Publish a message
try await client.publish(
topic: "chat.room1",
message: [
"user": "swift-user",
"text": "Hello from Swift!"
]
)
print("Message sent!")
}
SwiftUI Example
import SwiftUI
import Realtime
struct ChatView: View {
@StateObject private var viewModel = ChatViewModel()
@State private var messageText = ""
var body: some View {
VStack {
List(viewModel.messages) { message in
Text("\(message.user): \(message.text)")
}
HStack {
TextField("Message", text: $messageText)
Button("Send") {
viewModel.send(messageText)
messageText = ""
}
}
.padding()
}
.onAppear {
viewModel.connect()
}
}
}
class ChatViewModel: ObservableObject {
@Published var messages: [ChatMessage] = []
private var client: Realtime?
func connect() {
client = try? Realtime(
apiKey: "your-api-key",
secret: "your-secret"
)
client?.prepare()
Task {
try? await client?.connect()
client?.on(topic: "chat.room1", listener: self)
}
}
func send(_ text: String) {
Task {
try? await client?.publish(
topic: "chat.room1",
message: ["user": "ios-user", "text": text]
)
}
}
}
extension ChatViewModel: MessageListener {
func onMessage(_ msg: NatsMessage) {
if let data = msg.data as? [String: Any],
let user = data["user"] as? String,
let text = data["text"] as? String {
DispatchQueue.main.async {
self.messages.append(ChatMessage(user: user, text: text))
}
}
}
}
Run It
- Add your API credentials
- Run on simulator or device
- Messages will appear in real-time