Server-Sent Events في Swift: بث بيانات حقيقي بدون WebSocket

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

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

ابدأ الدورة

مقدمة: لماذا SSE هو صديقك الجديد الأفضل



تخيل: أنت جالس في مقهى مريح، تحتسي القهوة، بينما تطبيق iOS الخاص بك يستقبل في الخلفية أحدث أسعار العملات، إشعارات الرسائل الجديدة، أو بيانات من أجهزة استشعار IoT. وكل هذا - دون طلبات ping مستمرة للخادم، دون استنزاف البطارية، ودون بروتوكولات معقدة مثل WebSocket. تعرّف على: Server-Sent Events (SSE) في Swift - تقنية تجعل بث البيانات بسيطًا لدرجة أنك ستندهش لماذا لم تستخدمها من قبل.



في هذه المقالة، سنشرح كيفية تنفيذ Server-Sent Events في Swift لأنظمة iOS و macOS و watchOS و tvOS. ستتعرف على لماذا غالبًا ما يكون SSE أكثر ملاءمة من WebSocket، وكيفية كتابة عميل SSE خاص بك من الصفر، وما هي المزالق التي تنتظر المبتدئين. هيا بنا!



ما هي Server-Sent Events ولماذا نحتاجها؟



Server-Sent Events هي معيار W3C يسمح للخادم بإرسال البيانات إلى العميل عبر اتصال HTTP واحد. على عكس WebSocket، يعمل SSE في اتجاه واحد فقط (خادم ← عميل)، ولكن هذا يجعله مثاليًا للمهام التي لا تحتاج إلى اتصال ثنائي الاتجاه.



متى تختار SSE بدلاً من WebSocket؟

  • الإشعارات والتنبيهات - يرسل الخادم الأحداث، والعميل يقرأ فقط.
  • البيانات المتدفقة - أسعار الأسهم، مقاييس الخادم، تتبع GPS.
  • خلاصات الأخبار - تحديثات شبيهة بتويتر.
  • تقدم التنفيذ - تحميل الملفات، معالجة الفيديو.


الميزة الرئيسية لـ SSE على WebSocket هي البساطة. لا تحتاج إلى بروتوكول منفصل، يكفي HTTP عادي. وهذا يعني أن أي خادم بلغة Python أو Node.js أو Go يمكنه إرسال الأحداث إلى تطبيق Swift الخاص بك دون مكتبات إضافية.



كيف يعمل SSE: تحليل البروتوكول



يرسل الخادم استجابة HTTP عادية مع رأس Content-Type: text/event-stream. يتم تنسيق البيانات كالتالي:



event: messagedata: {"text": "مرحبًا بالعالم!"}id: 42

event: updatedata: {"count": 10}retry: 3000


الحقول الرئيسية:

  • event - نوع الحدث (اختياري).
  • data - نص الحدث (يمكن أن يكون متعدد الأسطر).
  • id - معرف لاستعادة الاتصال.
  • retry - الوقت بالمللي ثانية قبل إعادة الاتصال عند حدوث خطأ.


يتم فصل كل حدث بحرفي سطر جديد

. بسيط، أليس كذلك؟



إنشاء عميل SSE في Swift: من البسيط إلى المعقد



لا توجد فئة جاهزة لـ SSE في مكتبة Foundation القياسية، ولكن كتابة فئة خاصة بك تستغرق 15 دقيقة. نستخدم URLSession مع المفوض الذي يعالج البيانات المتدفقة.



الخطوة 1: الفئة الأساسية EventSource



import Foundation

final class EventSource: NSObject { private var url: URL private var session: URLSession? private var task: URLSessionDataTask? private var currentData = Data() private var lastEventId: String? var onEvent: ((String, String) -> Void)? // event, data var onError: ((Error) -> Void)? var onOpen: (() -> Void)? init(url: URL) { self.url = url super.init() } func connect() { var request = URLRequest(url: url) request.setValue("text/event-stream", forHTTPHeaderField: "Accept") if let lastId = lastEventId { request.setValue(lastId, forHTTPHeaderField: "Last-Event-ID") } let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = TimeInterval(INT_MAX) config.timeoutIntervalForResource = TimeInterval(INT_MAX) session = URLSession(configuration: config, delegate: self, delegateQueue: nil) task = session?.dataTask(with: request) task?.resume() } \

المدونات

توصيات الكتب