Skip to main content

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

  1. Add your API credentials
  2. Run on simulator or device
  3. Messages will appear in real-time