Swift पर WebSocket का परिचय: सिद्धांत से उन्नत अभ्यास तक
आधुनिक मोबाइल डेवलपमेंट में, real-time इंटरैक्शन सिर्फ एक विशेषता नहीं, बल्कि एक आवश्यकता बन गया है। उपयोगकर्ता उम्मीद करते हैं कि चैट, समाचार फ़ीड, कोटेशन और सूचनाएं तुरंत अपडेट हों, बिना किसी अनावश्यक pull-to-refresh इशारे के। WebSocket वह प्रोटोकॉल है जो क्लाइंट (आपके Swift एप्लिकेशन) और सर्वर के बीच एक स्थायी द्विदिश कनेक्शन स्थापित करने की अनुमति देता है।
इस लेख में, हम सरल "Hello, World!" से आगे बढ़ेंगे और iOS और macOS प्लेटफार्मों के लिए Swift पर WebSocket के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे। आप सीखेंगे कि एक विश्वसनीय कनेक्शन कैसे सेट करें, जटिल परिदृश्यों (कनेक्शन खोना, पुनः कनेक्ट करना, बैकग्राउंड मोड) को कैसे संभालें, और एक ऐसी आर्किटेक्चर कैसे बनाएं जो वास्तविक शेयर बाजार एप्लिकेशन या हजारों उपयोगकर्ताओं वाले चैट के लोड को सहन कर सके।
हम नेटिव URLSessionWebSocketTask (iOS 13+) और निचले संस्करणों के लिए लोकप्रिय लाइब्रेरी Starscream दोनों पर विचार करेंगे। कोड पूरी तरह से काम करने योग्य और एकीकरण के लिए तैयार होगा।
1. Swift पर WebSocket क्लाइंट की उन्नत सेटिंग
आइए मूल बातों से शुरू करें। एक सामान्य कनेक्शन के बजाय, हम एक मैनेजर बनाएंगे जो कनेक्शन के जीवनचक्र का प्रबंधन करेगा, त्रुटियों को संभालेगा और reconnect (स्वचालित पुनः कनेक्शन) का समर्थन करेगा।
1.1. स्वचालित पुनः कनेक्शन (Reconnect) के साथ मैनेजर
हम WebSocketManager क्लास को लागू करेंगे जो URLSessionWebSocketTask का उपयोग करता है। मुख्य विशेषता — सर्वर को ओवरलोड न करने के लिए पुनः कनेक्शन प्रयासों के बीच एक्सपोनेंशियल देरी है।
import Foundation
final class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private var session: URLSession? private var isConnected = false private var reconnectAttempt = 0 private let maxReconnectDelay: TimeInterval = 30 // अधिकतम देरी 30 सेकंड private let baseDelay: TimeInterval = 2 // आधार देरी 2 सेकंड var onMessageReceived: ((String) -> Void)? var onConnectionStateChanged: ((Bool) -> Void)? func connect(url: URL) { session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue()) let request = URLRequest(url: url, timeoutInterval: 10) webSocketTask = session?.webSocketTask(with: request) webSocketTask?.resume() receiveMessage() } private func reconnect() { guard let url = webSocketTask?.originalRequest?.url else { return } let delay = min(baseDelay * pow(2.0, Double(reconnectAttempt)), maxReconnectDelay) print("\\(delay) सेकंड में पुनः कनेक्ट हो रहा है... (प्रयास \\(reconnectAttempt + 1))") DispatchQueue.global().asyncAfter(deadline: .now() + delay) { [weak self] in self?.connect(url: url) self?.reconnectAttempt += 1 } } private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): self?.onMessageReceived?(text) case .data(let data): if let text = String(data: data, encoding: .utf8) { self?.onMessageReceived?(text) } @unknown default: break } self?.reconnectAttempt = 0 // सफल प्राप्ति पर काउंटर रीसेट self?.receiveMessage() // सुनना जारी रखें case .failure(let error): print("प्राप्ति त्रुटि: \\(error.localizedDescription)") self?.disconnect() self?.reconnect() } } } func send(text: String) {