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:
URLSessionilə 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:
-
URLSessionWebSocketTasknü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")!) -
Bağlantının başlanması.
// Bağlantını qurmaq üçün tapşırığı yenidən başlatmaq webSocketTask.resume() -
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)") } } -
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() -
Bağlantının həyat dövrü hadisələrinin işlənməsi (
URLSessionWebSocketDelegateistifadə 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.