Ios Apps'te Websocket ile Gerçek Zaman Sohbet Özelliklerini Uygulamayı
Neden iOS Uygulamalarında Gerçek Zamanlı Sohbet Maddeleri
Gerçek zamanlı iletişim modern mobil uygulamalar temel taşı haline geldi. Kullanıcılar anında mesaj teslimatını, canlı güncellemeler ve sayfa yenileme veya anket gecikmeleri olmadan sorunsuz bir şekilde etkileşimler bekliyor. iOS uygulamaları, gerçek zamanlı sohbet, önemli ölçüde katılım, tutma ve kullanıcı memnuniyeti artırabilir.Müşteri desteği için, ekip işbirliği veya sosyal ağ için, iyi hazırlanmış bir sohbet özelliği, basit bir araçtan dinamik bir platforma bir uygulama haline getirir.
Bu makale, webSocket teknolojisi, bu yüksek gecikme ile ilgili kalıcı, tam karmaşık iletişim kanalı sunuyor.Bu makale, WebSocket tabanlı gerçek zamanlı sohbetleri iOS uygulamaları, kurulumu, kodlama, en iyi uygulamalar ve üretim değerlendirmeleri uygulama için kapsamlı bir kılavuz sunuyor.
WebSocket'i iOS Context
WebSocket Protokolü Kısa Olarak
WebSocket (RFC 6455), tek bir TCP soketi üzerinde bir müşteri ve sunucu arasında kalıcı bir bağlantı kurar. İlk HTTP yükseltme elhake sonra, her iki taraf da mesaj gönderebilir ve mesajları asynchronously. Frames metin veya ikili yapabilir, WebSocket sohbet mesajları için çok yönlü yapabilir, JSON maaşları veya hatta medya akışı.
iOS'ta, geliştiriciler bir WebSocket müşterisini uygulamak için iki birincil seçeneği vardır:
- [FONT:0]URLSessionWebSocketTask[DÜT:1) – iOS 13. Hafiften beri Vakfı inşa etti, dış bağımlılıklar ve Apple'ın ağ yığınıyla doğal olarak entegre eder.
- [FONT:0]Starscream[[[Dönetici: 1 ) - Daha fazla esneklik sağlayan popüler açık kaynak kütüphanesi, kendi imzalı sertifikalar gibi gelişmiş özellikler ve daha eski iOS versiyonları ile uyumluluk.
Her iki yaklaşım da güvenli WebSocket bağlantıları (wss https) destekler ve proje gereksinimlerinize bağlı olarak değiştirilebilir.
WebSocket vs. Real-Time Chat için Alternatifler
Uygulamaya başlamadan önce, WebSocket'i iOS'ta kullanılan diğer gerçek zamanlı teknolojilerle karşılaştırmak faydalı:
- [FONTTP Long Polling[DÜDÜDÜDÜDÜDÜDÜDÜSÜSÜSÜŞÜNÜSÜŞÜNÜ:0)HTTP Long Polling[DÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜŞÜNÜDÜDÜDÜDÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN
- [FONT=0)Server-Sent Events (SSE))[FONT=0)[FONT=0)[FONT=FONT=0)[FONT-Yout Events (SSE)[FONT-Yout Events (SSE)).
- [FONT:0]Push Bildirims[[[Dönetici: 1 ) – Arka plandayken uygulamayı uyandırmak veya mesajları teslim etmek için büyük, ancak gerçek zamanlı iki yönlü iletişim için bir yedek değil.
WebSocket doğru dengeyi vuruyor: düşük gecikme, tam duplex ve yerli iOS desteği. Mobil uygulamalarda gerçek zamanlı sohbet için gerçek standart.
Önlemler ve Server-Side Kurulum
iOS uygulamanız bir WebSocket sunucusuna bağlanır. sunucu uygulaması bu makalenin kapsamının ötesindeyken, WebSocket'i destekleyeceğiniz bir sohbet oluşturabilirsiniz.If you are using ESFLT:0)Directus gerçek zamanlı yetenekleri (WebSocket API'si ile kullanılabilir), hızlı bir şekilde bir sohbet oluşturabilirsiniz. Directus, veri değişiklikleri ve mesajları ile abone olabilecek bir sonlu WebSocket uç noktası sağlar.
Özel bir Node.js sunucusu için, popüler seçimler [Dönder:0)ws[Dönetici ‘ws’ kütüphanesinde inşa edilmiş veya 03. Yıl[D)[Döneticileri değiştir] (Dönder.IO[DD)[Dönder)[Dönder)[Dönder) WebSocket.IO[D[Dönder)[Dönder)[Dönder.
Planlanması için anahtar sunucu yetenekleri:
- Kimlik ve token ilk elhakeme üzerinde geçerlilik
- Mesaj routing (özellikle alıcılara veya odalara)
- chat history
- Bağlantı hataları ve mesajla yeniden bağlantı kurmak kalıcılık
Directus kullanıyorsanız, özel sunucu kodu yazmadan bu özellikleri uygulamak için yerleşik koleksiyonlarına ve gerçek zamanlı aboneliklerine güvenebilirsiniz. Bu makale, JSON mesajlarını gönderen ve alan özel bir WebSocket sunucusu varsayacaktır.
iOS'ta bir WebSocket Müşterisi Oluşturun
Seçenek 1: URLSessionWebSocketTask (iOS 13+)
Bu yerel yaklaşım üçüncü taraf bağımlılıkları gerektirmez. Aşağıda bağlantı, yeniden bağlantı ve mesaj serileştirme ile uğraşan bir üretim hazırlayıcısı uygulamadır.
import Foundation
class ChatWebSocket {
private var webSocketTask: URLSessionWebSocketTask?
private var urlSession: URLSession = .shared
private var serverURL: URL
private var isConnected = false
private var reconnectTimer: Timer?
private var onMessage: ((ChatMessage) -> Void)?
private var onConnectionState: ((Bool) -> Void)?
init(serverURL: URL,
onMessage: @escaping (ChatMessage) -> Void,
onConnectionState: @escaping (Bool) -> Void) {
self.serverURL = serverURL
self.onMessage = onMessage
self.onConnectionState = onConnectionState
}
func connect() {
guard !isConnected else { return }
var request = URLRequest(url: serverURL)
// Add authentication token if required
// request.setValue("Bearer \(authToken)", forHTTPHeaderField: "Authorization")
webSocketTask = urlSession.webSocketTask(with: request)
webSocketTask?.resume()
isConnected = true
onConnectionState?(true)
listen()
}
private func listen() {
webSocketTask?.receive { [weak self] result in
guard let self = self else { return }
switch result {
case .failure(let error):
print("Receive error: \(error.localizedDescription)")
self.handleDisconnection()
case .success(let message):
switch message {
case .string(let text):
if let data = text.data(using: .utf8),
let chatMessage = try? JSONDecoder().decode(ChatMessage.self, from: data) {
self.onMessage?(chatMessage)
}
case .data(let data):
if let chatMessage = try? JSONDecoder().decode(ChatMessage.self, from: data) {
self.onMessage?(chatMessage)
}
@unknown default:
break
}
// Continue listening for the next message
self.listen()
}
}
}
func send(message: ChatMessage) {
guard let data = try? JSONEncoder().encode(message),
let text = String(data: data, encoding: .utf8) else { return }
webSocketTask?.send(.string(text)) { error in
if let error = error {
print("Send error: \(error.localizedDescription)")
}
}
}
func disconnect() {
reconnectTimer?.invalidate()
webSocketTask?.cancel(with: .goingAway, reason: nil)
isConnected = false
onConnectionState?(false)
}
private func handleDisconnection() {
webSocketTask = nil
isConnected = false
onConnectionState?(false)
// Exponential backoff reconnection
scheduleReconnect(delay: 2.0)
}
private func scheduleReconnect(delay: TimeInterval) {
reconnectTimer?.invalidate()
reconnectTimer = Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { [weak self] _ in
guard let self = self else { return }
self.connect()
// Next reconnection attempt with longer delay
// In production, implement increasing backoff
}
}
}
Bu kod, sabit bir gecikme ile otomatik yeniden bağlantıya sahiptir. Üretimde, erkanik olarak yeniden bağlantı kurmak isteyeceksiniz, onsuz problemlerden kaçınmak için.
Seçenek 2: Yıldızlarcream Kullanımı
Yıldızlarcream yaygın olarak kabul edilir ve ek kontrol sağlar. Swift Paket Manager veya CocoaPods aracılığıyla yükleyin.
import Starscream
class StarscreamWebSocketManager {
var socket: WebSocket!
init(serverURL: URL) {
var request = URLRequest(url: serverURL)
request.timeoutInterval = 5
socket = WebSocket(request: request)
socket.delegate = self
}
func connect() {
socket.connect()
}
func send(text: String) {
socket.write(string: text)
}
func disconnect() {
socket.disconnect()
}
}
extension StarscreamWebSocketManager: WebSocketDelegate {
func didReceive(event: WebSocketEvent, client: WebSocket) {
switch event {
case .connected(let headers):
print("connected: \(headers)")
case .disconnected(let reason, let code):
print("disconnected: \(reason) with code: \(code)")
case .text(let string):
// Parse JSON message
print("Received text: \(string)")
case .binary(let data):
print("Received data: \(data.count)")
case .ping(_):
break
case .pong(_):
break
case .viabilityChanged(_):
break
case .reconnectSuggested(_):
break
case .cancelled:
print("cancelled")
case .error(let error):
print("error: \(String(describing: error))")
}
}
}
Yıldızlar otomatik olarak ping /pong'u yönetiyor ve bağlantı değişiklikleri için etkinlikler sunuyor. delege modeli size yaşam döngüsü üzerinde daha fazla granular kontrolü veriyor.
Gerçekleştirme Core Chat Özellikler
Mesaj Data Model
yapılandırılmış bir mesaj ödeme yükü, parkları oluşturur ve güvenilir bir şekilde gösterir: Alanlar içerir:
- [FONT=2) - Benzersiz tanımlayıcı (UUUID)
- [FONTD][3][/FONT=IFONT=I][/FONT=)
- [[Dahire:)
- [FONT: 5)
- BÖRÜŞÜN - ISO 8601 tarih dizesi
- [FONT=FONT=FONT=FONT=FONT=I=I=I=I=I=I=I=I=I=I=I=I=I=)
- [[DÜDÜDÜSÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ - Ek veriler için Seçmeli Söz (Doğal URL, reaksiyonlar, vb.)
Kolay serileştirme için Codable kullanın:
struct ChatMessage: Codable {
let id: String
let senderId: String
let senderName: String
let text: String
let timestamp: Date
let type: MessageType
let metadata: [String: String]?
enum MessageType: String, Codable {
case text, image, video, system
}
}
Typing Göstergeleri
Bir kullanıcının yazım yaptığı zaman göstermek için, hafif olaylar gönderin:
// Client sends {"type": "typing", "userId": "123", "conversationId": "abc"}
// Server broadcasts to other participants
// Receive typing event:
struct TypingEvent: Codable {
let type: String // "typing" or "stopTyping"
let userId: String
let conversationId: String
}
Throttle bu olayları selingten kaçınmak için (örneğin, her 300ms gönderin, artı kullanıcı durduğunda son bir “stopTyping” gönder.
Receipts ve Delivery Acknowledgments
Bir uyarıyı gerektiren mesajlar referansı içerebilir. Bir müşteri bir mesaj aldığında, bir onay gönderebilir:
// Server includes message ID; client sends {"type": "ack", "messageId": "..."}
// Server can then update the sender's UI to show "Read" or "Delivered".
iOS'ta, mesajın aslında kullanıcıya gösterdiği zaman bir şans göndermenizi sağlayın (örneğin, hücre görünür hale geldiğinde).
WebSocket Bağlantıları
Güvenlik başlangıçtan ele alınmalıdır. İşte temel önlemler:
- [FONT:0)Her zaman WSS[DÜDÜT:1) kullanır - WebSocket over TLS, sunucunuzu geçerli bir SSL sertifikası ile yapılandırır.
- [FONT:0]Authenticate the connection[DÜT:1) - Bir token (örneğin, JWT) ilk HTTP elhake başlıkları veya bir sorgu parametresi olarak, bağlantıya izin vermeden önce sunucuda geçerlidir.
- [FONT:0]Validate mesajları[[[Dönetici: 1) – Server, gelen her mesajın gönderici kimliğini doğrulamalıdır. asla müşteri tarafından sunulan göndericiye güvenmeyin.
- [FONT:0)Kate limiti[[Dönetici:0)[[Dönetici:0)[[Dönetici: 1)) - Tek bir müşteriden ikinci mesaj sayısını sınırlamak için kötüye kullanılması.
- [[Dönetici:0)Kategorileri[Döneticileri değiştir)[Döneticileri değiştir) * Bir WebView veya kendi arayüzünde mesajları gösteren metin içeriğinizi engeller veya cezalandırılır.
iOS için Apple'ın ATS (App Transport Security) TLS'yi varsayılan olarak uygular.Eğer ESFLT:12 kullanıyorsanız (sorsuz), Info.plist'de bir istisna eklemek zorundasınız, ancak bunu üretimde kaçınmalısınız.
Üretim Sohbet Uygulamaları için En İyi Uygulamalar
Exponential Backoff ile Bağlantı Stratejisi
Ağ kesintileri kaçınılmazdır. Üstel arka ve rastgele jitter ile sağlam bir yeniden bağlantı mantığı sunucu aşırı yüklemesini önler:
private func scheduleReconnect() {
let baseDelay: TimeInterval = 1.0
let maxDelay: TimeInterval = 30.0
reconnectAttempt += 1
let delay = min(pow(2.0, Double(reconnectAttempt)) * baseDelay, maxDelay)
// Add jitter: ±50% of delay
let jitter = Double.random(in: -delay * 0.5...delay * 0.5)
DispatchQueue.main.asyncAfter(deadline: .now() + delay + jitter) { [weak self] in
self?.connect()
}
}
* * * * * * * * * * * * * * * * *
Arka plan devleti ve Bildirimleri Dene Etmek
Uygulama arka plana girdiğinde, WebSocket bağlantısı iOS tarafından askıya alınabilir. Gerçek zamanlı teslimatı korumak için, WebSocket'i push bildirimleri ile bir araya getirin:
- Uygulama arka plana gittiğinde, sunucuya “sonOnline” bir zaman gönderin.
- Server, kullanıcının çevrimdışı olduğu zaman gelen mesajlar için APNs aracılığıyla bildirimleri gönderir.
- Foreground'a geri döndükten sonra, WebSocket'i yeniden bağlayın ve sunucudan kaçırılan mesajları getir.
Bağlantıyı yönetmek içinFLT:15 kullanın.
Offline Mesaj Queue
WebSocket, yerel olarak bağlantıya geçmiş mesajları kapatıp bir kez daha bir araya getirse, yerel bir veritabanı (örneğin, Core Data veya Realm) uygulama başlatıcıları boyunca kuyrukları devam ettirecek.
Mesaj siparişi ve Deduplication
Mesajlar ağ koşulları nedeniyle siparişden çıkabilir.Bir dizi veya zamanlayıcı bir tür kullanın.Müşteri tarafında, yeniden bağlantıdan sonra tekrar tekrarlamadan önce çoğaltmaktan kaçınmak için mesaj ile karıştırın.
UI Sorumluluk
Tüm WebSocket I/O arka ipliklerde çalışır. Her zaman UI güncelleştirmelerini ana konuya gönderin:
DispatchQueue.main.async { [weak self] in
self?.updateChatUI(with: chatMessage)
}
Swift koncurrency için bir araya veya bir eşdeğerlik için bir beklemeyi düşünün.
Test ve Debugging WebSocket in iOS
Simulator and Device Test
Her iki simülatörü ve gerçek cihazlar üzerinde test edin. Simulators daha az ağ kısıtlamaları vardır, bu yüzden geçici bağlantı veya arka süspansiyon gibi sorunları kaçırabilirsiniz.
Debugging için araçlar
- [FONT=0)Paw veya Postman[Dönetici:0)[Dön test için WebSocket bağlantılarını simüle edebilir.
- [FONT=0]Charles Proxy / Proxyman – Inspect WebSocket çerçeveleri (sayfa ve ikili) geçişte.
- [0]Network Link Durumer[Dönetici:0)[Dönetici: Eşlik, paket kaybı).
- [FONT=0)Xcode Console ve Instruments[[Dönetici: 1) Log bağlantı olayları ve hafıza kullanımını izlemek.
Ortak Pitfalls
- [FONT:0) WebSocket görevinde bulunan (Dönetici) çağrılmayı hak edin.
- [FONT:0) Bir mesaj aldıktan sonra yeniden listelenmemelidir[Dönetici:0) - Her bir gelen mesajı tüketin. tekrar aramanız gerekir (yukarıdaki recursive.D:22 modeli bakınız).
- [FONT:0]Memory sızıntıları[[Döneticiler) – Sürekli kapanış delegelerinde Güçlü referans döngüleri.
- [FONT:0] ağır JSON parsing[[Dönemli) ile ana iplikleri açın; Arka kuyrukta Parse mesajları.
Gerçek Zaman Geri Döndüren için Directus ile Bağlanma
Directus, arka uç gelişimini basitleştiren bir WebSocket arayüzü sunar. Directus ile, yapabilirsiniz:
- Herhangi bir koleksiyonda (örneğin, aurFLT:25) değişikliklere abone olun ve gerçek zamanlı güncellemeler alın.
- Diğer müşterilerin dinlemesi gereken özel etkinlikler gönderin.
- Directus'un token tabanlı sistemi aracılığıyla doğrulama.
Directus WebSocket'i iOS'ta entegre etmek:
// Example using URLSessionWebSocketTask
guard let url = URL(string: "wss://your-directus-instance.com/websocket") else { return }
let task = URLSession.shared.webSocketTask(with: url)
task.resume()
// Subscribe to a collection
let subscribeMessage = """
{"type":"subscribe","collection":"messages","query":{"filter":{"status":{"_eq":"published"}}}}
""".data(using: .utf8)!
task.send(.data(subscribeMessage)) { error in
if let error = error { print(error) }
}
Directus, oldukları gibi değişiklikleri itecektir. Bu, daha fazla ayrıntı için özel sunucu mantığını azaltır, ESX WebSocket belgesini ).
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
WebSocket ile bir iOS uygulamasında gerçek zamanlı sohbet yapmak hem modern kullanıcı deneyimleri için hem ödüllendirici hem de temeldir. Apple'ın yerlisi:03FLT:27) veya Starscream kütüphanesine göre, bu makaleye karşı bağlantı kurmak, mesaj modelleri, güvenli düşünceler, yeniden bağlantı stratejileri ve mobil ağ ortamların zorluklarını işlemek için en iyi uygulamalar oluşturabilirsiniz.
Bir sohbet uygulaması sadece güvenilirliği kadar iyidir. Yeniden bağlantı mantığı, çevrimdışı queuing ve bildirim entegrasyonunu etkinleştirin. Özel bir WebSocket sunucusu inşa etmek veya Directus gibi bir çözüm kullanmak, prensipler aynı kalır: bağlantıya devam etmek, mesajları güvenli tutmak ve kodunuzu sağlamak.Bu temellerle, iOS uygulamanız kullanıcılarınızın gerçek zamanlı iletişiminizi sağlayacaktır.
Daha fazla okuma için Apple'ın dokümantasyonunu www.D.D.D.SocketTask[D:2) ve [[DÜSÜ:2|Starscream GitHub repository[[DÜDÜDÜDÜDÜDÜDÜ)[Üye Olmayanlar İçin Tıklayınız.