مكتبة WebSocket Swift: Starscream لنظامي iOS/macOS

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

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

ابدأ الدورة

Starscream — مكتبة WebSocket للغة Swift (iOS/macOS)



Starscream هي مكتبة خفيفة الوزن ولكنها قوية للعمل مع بروتوكول WebSocket على منصات Apple. مكتوبة بالكامل بلغة Swift، وليس لها تبعيات خارجية، وتدعم iOS وmacOS وtvOS وwatchOS. إذا كنت بحاجة إلى تنظيم اتصال ثنائي الاتجاه في الوقت الفعلي بين تطبيق الهاتف المحمول والخادم (دردشة، إشعارات، ألعاب عبر الإنترنت) — فإن Starscream ستكون خيارًا ممتازًا.



الميزات الرئيسية

  • دعم كامل لمعيار RFC 6455 (بروتوكول WebSocket).
  • العمل عبر الاتصال الآمن wss:// والاتصال العادي ws://.
  • إعادة الاتصال التلقائي عند انقطاع الاتصال.
  • دعم الإطارات: النص، البيانات الثنائية (Data)، ping/pong.
  • تكامل سهل عبر CocoaPods أو Swift Package Manager أو Carthage.
  • التوافق مع Combine (iOS 13+) و Swift Concurrency (async/await).


التثبيت عبر Swift Package Manager (موصى به)

أضف الحزمة في Xcode: File → Add Packages وأدخل رابط المستودع:

https://github.com/daltoniam/Starscream.git

اختر الإصدار (الأحدث المستقر) وأضفه إلى هدفك.



مثال أساسي للاتصال

لننشئ عميل WebSocket بسيطًا يتصل بالخادم ويعرض الرسائل المستلمة.

import Starscream

class WebSocketManager { var socket: WebSocket? func connect() { var request = URLRequest(url: URL(string: "wss://echo.websocket.org")!) request.timeoutInterval = 5 socket = WebSocket(request: request) socket?.delegate = self socket?.connect() }}

extension WebSocketManager: WebSocketDelegate { func didReceive(event: WebSocketEvent, client: WebSocket) { switch event { case .connected(let headers): print("متصل! الرؤوس: \\(headers)") case .disconnected(let reason, let code): print("تم قطع الاتصال: \\(reason) (الكود: \\(code))") case .text(let string): print("تم استلام نص: \\(string)") case .binary(let data): print("تم استلام بيانات ثنائية: \\(data.count) بايت") case .ping(let data): print("بينغ: \\(data?.hexString ?? "لا توجد بيانات")") case .pong(let data): print("بونغ: \\(data?.hexString ?? "لا توجد بيانات")") case .viabilityChanged(let isViable): print("الاتصال نشط: \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("يُوصى بإعادة الاتصال: \\(shouldReconnect)") case .cancelled: print("تم إلغاء الاتصال") case .error(let error): print("خطأ: \\(error?.localizedDescription ?? "خطأ غير معروف")") } }}


إرسال البيانات

تتيح Starscream إرسال كل من السلاسل النصية والبيانات الثنائية. مثال على إرسال JSON:

func sendMessage(text: String) {    let message: [String: Any] = [        "type": "chat",        "content": text,        "timestamp": Int(Date().timeIntervalSince1970)    ]    if let jsonData = try? JSONSerialization.data(withJSONObject: message, options: []),       let jsonString = String(data: jsonData, encoding: .utf8) {        socket?.write(string: jsonString)    }}

// إرسال ملف ثنائي (مثل صورة)func sendImage(data: Data) { socket?.write(data: data)}


العمل مع Combine (iOS 13+)

للبرمجة التفاعلية، توفر Starscream Publisher:

import Combine

class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req

توصيات