WebSocket في Swift: تطبيقات real-time متقدمة لنظامي iOS/macOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

WebSocket في Swift: إنشاء تطبيقات real-time بمستوى متقدم

\n

في تطوير التطبيقات المحمولة الحديثة، أصبح التفاعل الفوري (real-time) ليس مجرد ميزة إضافية بل ضرورة. أسعار الأسهم المالية، الألعاب عبر الإنترنت، تطبيقات المراسلة، التحرير المشترك للمستندات — كلها تتطلب نقلًا فوريًا للبيانات بين العميل والخادم. في نظام Apple البيئي، توفر أطر العمل Swift و Foundation أدوات قوية للعمل مع بروتوكول WebSocket. في هذه المقالة، سنستعرض تقنيات متقدمة: من URLSessionWebSocketTask الأصلي إلى معالجة الأخطاء المخصصة، تعدد المهام، وتحسين الأداء.

\n\n

1. تنفيذ WebSocket الأصلي عبر URLSessionWebSocketTask (iOS 13+)

\n

بدءًا من iOS 13، توفر Apple دعمًا مدمجًا لـ WebSocket عبر URLSessionWebSocketTask. هذه هي الطريقة المفضلة لأنها لا تتطلب تبعيات خارجية ومتكاملة بعمق مع نظام إدارة الاتصالات.

\n\n

1.1. إنشاء الجلسة وتكوينها

\n

لنبدأ بإنشاء مدير WebSocket مع دعم إعادة الاتصال وتجميع الخيوط:

\n
import 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\n

1.2. معالجة متقدمة للرسائل مع التصنيف

\n

لننشئ enum لأنواع الرسائل وننفذ التحليل:

\n
enum 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\n

2. العمل المتقدم مع تعدد المهام والأداء

\n

تتطلب تطبيقات real-time أداءً عاليًا. دعنا نستعرض التحسينات الرئيسية.

\n\n

2.1. قائمة انتظار رسائل آمنة للخيوط

\n
class ThreadSafeMessageQueue {\n    private var queue = [WebSocketMessage]()\n                

المدونات

توصيات الكتب