Sobes.tech
Middle

WebSocket ilə işləmək üçün hansı həll yolundan istifadə etdiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Layihələrdə, orada iki tərəfli real vaxt qarşılıqlı əlaqə tələb olunurdu, mən uğurla URLSessionWebSocketTask istifadə etmişəm.

Bu, Network çərçivəsinin daxili həllidir və iOS 13-dən etibarən mövcuddur.

URLSessionWebSocketTask-in üstünlükləri:

  • Təbii: URLSession ilə inteqrasiya olunub, bu da əlaqələrin idarə olunmasını və şəbəkə hadisələrinin işlənməsini sadələşdirir.
  • Performans: Sistem səviyyəsində şəbəkə ilə işləmək üçün optimallaşdırılıb.
  • Etibarlılıq: Daxili ping və pong mexanizmi, avtomatik yenidən qoşulma cəhdləri (mürəkkəb ssenarilər üçün əlavə loqika lazım ola bilər).
  • Təhlükəsizlik: TLS dəstəklənir.

Əsas mərhələlər:

  1. URLSessionWebSocketTask nümunəsinin yaradılması.

    // Standart konfiqurasiya ilə URLSession nümunəsinin yaradılması
    let session = URLSession(configuration: .default)
    // WebSocket tapşırığının başlanması
    let webSocketTask = session.webSocketTask(with: URL(string: "wss://example.com/socket")!)
    
  2. Bağlantının başlanması.

    // Bağlantını qurmaq üçün tapşırığı yenidən başlatmaq
    webSocketTask.resume()
    
  3. Mesajların göndərilməsi (mətn və ya ikili məlumatlar).

    // Mətn mesajının göndərilməsi
    webSocketTask.send(.string("Hello, world!")) { error in
        if let error = error {
            print("Göndərmə xətası: \(error)")
        }
    }
    
    // İkili məlumatların göndərilməsi
    let dataToSend = Data([1, 2, 3])
    webSocketTask.send(.data(dataToSend)) { error in
        if let error = error {
            print("Göndərmə xətası: \(error)")
        }
    }
    
  4. Mesajların qəbul edilməsi. Bu asinxron prosesdir.

    // Mesajların qəbul edilməsi üçün rekursiv funksiya
    func receiveMessage() {
        webSocketTask.receive { result in
            switch result {
            case .failure(let error):
                print("Qəbul xətası: \(error)")
                // Xətanın işlənməsi, ehtimal ki, yenidən qoşulma cəhdləri
            case .success(let message):
                switch message {
                case .string(let text):
                    print("Qəbul edilən mətn mesajı: \(text)")
                case .data(let data):
                    print("Qəbul edilən ikili məlumatlar: \(data)")
                @unknown default:
                    fatalError("Naməlum mesaj tipi")
                }
                // Mesajları dinləməyə davam et
                self.receiveMessage()
            }
        }
    }
    
    // Dinləyicini işə salmaq
    receiveMessage()
    
  5. Bağlantının həyat dövrü hadisələrinin işlənməsi (URLSessionWebSocketDelegate istifadə etməklə).

    // Delegate nümunəsinin tətbiqi
    class WebSocketHandler: NSObject, URLSessionWebSocketDelegate {
        func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {
            print("Qoşulma açıldı")
            // Açıldıqdan sonra mesajların qəbuluna başlamaq
            receiveMessage() // receiveMessage-in təyin olunduğu qəbul edilir
        }
    
        func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {
            let reasonString = reason.flatMap { String(data: $0, encoding: .utf8) } ?? "Naməlum səbəb"
            print("Qoşulma kod ilə bağlandı \(closeCode.rawValue), səbəb: \(reasonString)")
            // Yenidən qoşulma və ya bağlama loqikası
        }
    
        // Sessiyanın xətalarının işlənməsi
        func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
            if let error = error {
                print("Tapşırıq xətayla tamamlandı: \(error)")
                // Əlavə xətaların işlənməsi loqikası
            }
        }
    }
    
    // Sessiya yaradarkən delegate istifadə edin
    let delegate = WebSocketHandler()
    let sessionWithDelegate = URLSession(configuration: .default, delegate: delegate, delegateQueue: OperationQueue())
    let webSocketTaskWithDelegate = sessionWithDelegate.webSocketTask(with: URL(string: "wss://example.com/socket")!)
    

Həmçinin, mən xarici kitabxanalar da istifadə etmişəm, məsələn, Starscream, daha köhnə iOS versiyaları və ya native həllərdə olmayan funksional imkanlar üçün (məsələn, avtomatik yenidən qoşulma ilə eksponensial geri çəkilmə). Ancaq, mümkün olduqda, üstünlük verdim URLSessionWebSocketTask-ə, yuxarıda qeyd olunan üstünlüklər səbəbindən.