WebSocket ile çalışmak için hangi çözümü kullandınız?
sobes.tech yapay zeka
AI'dan gelen yanıt
Gerçek zamanlı çift yönlü etkileşim gerektiren projelerde, URLSessionWebSocketTask'ı başarıyla kullandım.
Bu, iOS 13'ten itibaren kullanılabilen Network framework'ünün yerleşik bir çözümüdür.
URLSessionWebSocketTask'ın avantajları:
- Yerel:
URLSessionile entegre, bu da bağlantıların yönetimini ve ağ olaylarının işlenmesini kolaylaştırır. - Performans: Sistem seviyesinde ağ ile çalışmak üzere optimize edilmiştir.
- Güvenilirlik: Yerleşik ping ve pong mekanizması, otomatik yeniden bağlanma girişimleri (karmaşık senaryolar için ek mantık gerekebilir).
- Güvenlik: TLS'yi kutudan çıkar çıkmaz destekler.
Ana çalışma aşamaları:
-
URLSessionWebSocketTaskörneği oluşturma.// Varsayılan yapılandırma ile bir URLSession örneği oluşturma let session = URLSession(configuration: .default) // WebSocket görevi başlatma let webSocketTask = session.webSocketTask(with: URL(string: "wss://example.com/socket")!) -
Bağlantıyı başlatma.
// Bağlantıyı kurmak için görevi yeniden başlatma webSocketTask.resume() -
Mesaj gönderme (metin veya ikili veri).
// Metin mesajı gönderme webSocketTask.send(.string("Hello, world!")) { error in if let error = error { print("Gönderme hatası: \(error)") } } // İkili veri gönderme let dataToSend = Data([1, 2, 3]) webSocketTask.send(.data(dataToSend)) { error in if let error = error { print("Gönderme hatası: \(error)") } } -
Mesaj alma. Bu asenkron bir süreçtir.
// Mesaj almak için özyinelemeli fonksiyon func receiveMessage() { webSocketTask.receive { result in switch result { case .failure(let error): print("Alma hatası: \(error)") // Hata işleme, gerekirse yeniden bağlanma case .success(let message): switch message { case .string(let text): print("Alınan metin mesajı: \(text)") case .data(let data): print("Alınan ikili veri: \(data)") @unknown default: fatalError("Bilinmeyen mesaj tipi") } // Mesajları dinlemeye devam et self.receiveMessage() } } } // Dinlemeyi başlat receiveMessage() -
Bağlantının yaşam döngüsü olaylarını yönetme (
URLSessionWebSocketDelegatekullanarak).// Delegate örneği class WebSocketHandler: NSObject, URLSessionWebSocketDelegate { func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) { print("Bağlantı açık") // Açıldıktan sonra mesaj almaya başla receiveMessage() // receiveMessage'in tanımlı olduğu varsayılır } func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) { let reasonString = reason.flatMap { String(data: $0, encoding: .utf8) } ?? "Bilinmeyen neden" print("Bağlantı kapandı, kod: \(closeCode.rawValue), neden: \(reasonString)") // Yeniden bağlanma veya sonlandırma mantığı } // Oturum hatalarını işleme func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if let error = error { print("Görev hata ile sona erdi: \(error)") // Ek hata işleme mantığı } } } // Oturum oluştururken delegate kullan let delegate = WebSocketHandler() let sessionWithDelegate = URLSession(configuration: .default, delegate: delegate, delegateQueue: OperationQueue()) let webSocketTaskWithDelegate = sessionWithDelegate.webSocketTask(with: URL(string: "wss://example.com/socket")!)
Ayrıca, eski iOS sürümleri veya native çözümde bulunmayan belirli özellikler (örneğin, otomatik yeniden bağlanma) için Starscream gibi üçüncü taraf kütüphaneler de kullandım. Ancak, mümkün olan her durumda, yukarıda bahsedilen avantajlar nedeniyle URLSessionWebSocketTask'ı tercih ettim.