Sobes.tech
Middle

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: URLSession ile 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ı:

  1. 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")!)
    
  2. Bağlantıyı başlatma.

    // Bağlantıyı kurmak için görevi yeniden başlatma
    webSocketTask.resume()
    
  3. 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)")
        }
    }
    
  4. 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()
    
  5. Bağlantının yaşam döngüsü olaylarını yönetme (URLSessionWebSocketDelegate kullanarak).

    // 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.