WebSocket في Swift: إنشاء تطبيقات real-time بمستوى متقدم
\nفي تطوير التطبيقات المحمولة الحديثة، أصبح التفاعل الفوري (real-time) ليس مجرد ميزة إضافية بل ضرورة. أسعار الأسهم المالية، الألعاب عبر الإنترنت، تطبيقات المراسلة، التحرير المشترك للمستندات — كلها تتطلب نقلًا فوريًا للبيانات بين العميل والخادم. في نظام Apple البيئي، توفر أطر العمل Swift و Foundation أدوات قوية للعمل مع بروتوكول WebSocket. في هذه المقالة، سنستعرض تقنيات متقدمة: من URLSessionWebSocketTask الأصلي إلى معالجة الأخطاء المخصصة، تعدد المهام، وتحسين الأداء.
1. تنفيذ WebSocket الأصلي عبر URLSessionWebSocketTask (iOS 13+)
\nبدءًا من iOS 13، توفر Apple دعمًا مدمجًا لـ WebSocket عبر URLSessionWebSocketTask. هذه هي الطريقة المفضلة لأنها لا تتطلب تبعيات خارجية ومتكاملة بعمق مع نظام إدارة الاتصالات.
1.1. إنشاء الجلسة وتكوينها
\nلنبدأ بإنشاء مدير WebSocket مع دعم إعادة الاتصال وتجميع الخيوط:
\nimport Foundation\n\nclass WebSocketManager: NSObject {\n private var webSocketTask: URLSessionWebSocketTask?\n private var session: URLSession!\n private let queue = DispatchQueue(label: "com.websocket.queue", qos: .userInitiated)\n private var isConnected = false\n \n override init() {\n super.init()\n let config = URLSessionConfiguration.default\n config.waitsForConnectivity = true\n config.timeoutIntervalForResource = 300\n session = URLSession(configuration: config, delegate: self, delegateQueue: nil)\n }\n \n func connect(url: URL) {\n webSocketTask = session.webSocketTask(with: url)\n webSocketTask?.resume()\n receiveMessage()\n }\n \n func disconnect() {\n webSocketTask?.cancel(with: .normalClosure, reason: nil)\n isConnected = false\n }\n}\n\n1.2. معالجة متقدمة للرسائل مع التصنيف
\nلننشئ enum لأنواع الرسائل وننفذ التحليل:
\nenum WebSocketMessage {\n case text(String)\n case data(Data)\n case ping\n case pong\n case error(Error)\n}\n\nextension WebSocketManager: URLSessionWebSocketDelegate {\n func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {\n isConnected = true\n print("WebSocket connected")\n }\n \n func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {\n isConnected = false\n print("WebSocket closed: \\(closeCode)")\n // إعادة الاتصال التلقائي بعد 5 ثوانٍ\n DispatchQueue.global().asyncAfter(deadline: .now() + 5) { [weak self] in\n self?.reconnect()\n }\n }\n \n private func receiveMessage() {\n webSocketTask?.receive { [weak self] result in\n switch result {\n case .success(let message):\n self?.handleMessage(message)\n self?.receiveMessage() // استقبال دوري\n case .failure(let error):\n self?.handleError(error)\n }\n }\n }\n \n private func handleMessage(_ message: URLSessionWebSocketTask.Message) {\n switch message {\n case .string(let text):\n processText(text)\n case .data(let data):\n processData(data)\n @unknown default:\n break\n }\n }\n}\n\n2. العمل المتقدم مع تعدد المهام والأداء
\nتتطلب تطبيقات real-time أداءً عاليًا. دعنا نستعرض التحسينات الرئيسية.
\n\n2.1. قائمة انتظار رسائل آمنة للخيوط
\nclass ThreadSafeMessageQueue {\n private var queue = [WebSocketMessage]()\n