Architettura di una Chat Realtime Moderna
Una chat professionale stile Telegram o WhatsApp richiede tre componenti essenziali:
- Server WebSocket ad alte prestazioni: Gestito in modo nativo con Laravel Reverb o Node.js Socket.io, capace di gestire 50.000+ connessioni simultanee con latenza sub-10ms.
- Stato dei Messaggi a 3 Livelli: Inviato (1 spunta grigia) -> Consegnato sul dispositivo (2 spunte grigie) -> Letto dall'utente (2 spunte blu).
- Client SwiftUI Reattivo: Utilizzo di
@Observablee stream asincroni per aggiornare la UI istantaneamente a 60fps.
Codice Client: SwiftUI WebSocket Chat Engine
import SwiftUI
enum MessageStatus: String, Codable {
case sending = "clock"
case sent = "checkmark"
case delivered = "checkmark.double"
case read = "checkmark.double.fill"
}
struct ChatMessage: Identifiable, Codable {
let id: UUID
let senderId: String
let text: String
let timestamp: Date
var status: MessageStatus
}
@Observable
final class RealtimeChatViewModel {
var messages: [ChatMessage] = []
var isTyping: Bool = false
private var webSocketTask: URLSessionWebSocketTask?
func connect(roomId: String, authToken: String) {
let url = URL(string: "wss://chat.diallodev.online/app/reverb?room=\(roomId)&token=\(authToken)")!
let session = URLSession(configuration: .default)
webSocketTask = session.webSocketTask(with: url)
webSocketTask?.resume()
listenForMessages()
}
func sendMessage(text: String) {
let newMsg = ChatMessage(
id: UUID(),
senderId: "currentUser",
text: text,
timestamp: Date(),
status: .sending
)
messages.append(newMsg)
let payload: [String: Any] = [
"event": "client-message",
"data": ["id": newMsg.id.uuidString, "text": text]
]
if let data = try? JSONSerialization.data(withJSONObject: payload),
let jsonString = String(data: data, encoding: .utf8) {
webSocketTask?.send(.string(jsonString)) { [weak self] error in
if error == nil {
DispatchQueue.main.async {
if let idx = self?.messages.firstIndex(where: { $0.id == newMsg.id }) {
self?.messages[idx].status = .sent
}
}
}
}
}
}
private func listenForMessages() {
webSocketTask?.receive { [weak self] result in
switch result {
case .success(let message):
switch message {
case .string(let text):
self?.handleIncomingJSON(text)
case .data(let data):
break
@unknown default:
break
}
self?.listenForMessages()
case .failure(let error):
print("WebSocket disconnesso: \(error.localizedDescription)")
}
}
}
private func handleIncomingJSON(_ jsonString: String) {
// Parsing evento nuovo messaggio o spunta lettura
}
}
Vuoi creare la tua App o hai bisogno di consulenza personalizzata?
Sviluppo app iOS native in SwiftUI, piattaforme backend scalabili e offro supporto strategico per monetizzazione e progetti internazionali.