WebSocket على Swift: بناء تطبيقات فورية (real-time) لنظامي iOS وmacOS

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

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

ابدأ الدورة

مقدمة إلى WebSocket بلغة Swift: من النظرية إلى التطبيق



تتطلب التطبيقات الحديثة للهواتف المحمولة وأجهزة الكمبيوتر المكتبية بشكل متزايد نقل البيانات الفوري. سواء كان ذلك تطبيق محادثة، أو محطة تداول، أو لعبة عبر الإنترنت، أو نظام مراقبة — يتوقع المستخدمون تحديث المعلومات في الوقت الفعلي دون الحاجة إلى تحديث الشاشة باستمرار. وهنا يأتي دور بروتوكول WebSocket.



على عكس طلب HTTP التقليدي الذي يعمل وفق مبدأ "طلب-استجابة"، يقوم WebSocket بإنشاء اتصال ثنائي الاتجاه دائم بين العميل والخادم. وهذا يعني أن الخادم يمكنه إرسال البيانات إلى العميل في أي وقت دون الحاجة إلى طلب مسبق. في نظام Apple البيئي، تتوفر حلول أصلية للعمل مع WebSocket (URLSessionWebSocketTask) بالإضافة إلى مكتبات الطرف الثالث الشائعة مثل Starscream.



في هذه المقالة، سنشرح كيفية دمج WebSocket في تطبيق Swift الخاص بك لنظامي iOS و macOS، وسنكتب أمثلة عملية للكود، ونستعرض أفضل الممارسات.



1. التنفيذ الأصلي لـ WebSocket عبر URLSession



بدءًا من iOS 13 و macOS 10.15، توفر Apple دعمًا مدمجًا لـ WebSocket من خلال الفئة URLSessionWebSocketTask. هذه هي الطريقة الأبسط والموصى بها، ولا تتطلب تثبيت تبعيات خارجية.



إنشاء وتكوين الاتصال



للبدء، يجب إنشاء نسخة من URLSession وتحديد التكوين. ثم نقوم بتكوين عنوان URL باستخدام البروتوكول ws:// (أو wss:// للاتصال الآمن) وإنشاء مهمة WebSocket.



import Foundation

class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private let session: URLSession override init() { let config = URLSessionConfiguration.default self.session = URLSession(configuration: config, delegate: nil, delegateQueue: OperationQueue()) super.init() } func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() receiveMessage() } func disconnect() { webSocketTask?.cancel(with: .normalClosure, reason: nil) }}


إرسال واستقبال الرسائل



يدعم WebSocket إرسال كل من البيانات النصية (URLSessionWebSocketTask.Message.string) والبيانات الثنائية (.data). لاستقبال الرسائل، يجب استدعاء الأسلوب receive بشكل متكرر، لأنه يعالج رسالة واحدة فقط في كل مرة.



extension WebSocketManager {    func sendMessage(_ text: String) {        let message = URLSessionWebSocketTask.Message.string(text)        webSocketTask?.send(message) { error in            if let error = error {                print("خطأ في الإرسال: \\(error.localizedDescription)")            }        }    }        private func receiveMessage() {        webSocketTask?.receive { [weak self] result in            switch result {            case .success(let message):                switch message {                case .string(let text):                    print("تم استقبال رسالة نصية: \\(text)")                case .data(let data):                    print("تم استقبال بيانات ثنائية: \\(data.count) بايت")                @unknown default:                    print("نوع رسالة غير معروف")                }                // استمر في الاستماع بشكل متكرر                self?.receiveMessage()            case .failure(let error):                print("خطأ في الاستقبال: \\(error.localizedDescription)")            }        }    }}


لاحظ الاستدعاء المتكرر receiveMessage() داخل إغلاق النجاح — وهذا يضمن أن تطبيقك سيستمر في تلقي البيانات الجديدة

المدونات

توصيات الكتب