برمجة الشبكات في Swift: من البسيط إلى المعقد
\n\nعندما تفتح Xcode لأول مرة وترى مشروعًا فارغًا، يبدو أن الطريق إلى السحر الحقيقي للتفاعل الشبكي لا يزال بعيدًا. لكن صدقني: برمجة الشبكات في Swift ليست علم صواريخ، بل هي أداة ملموسة تمامًا تحول التطبيق المحلي إلى جزء من الإنترنت العالمي. اليوم سنشرح كيف تجعل تطبيقك "يتحدث" مع الخوادم، ويتبادل البيانات، ويفعل ذلك بأناقة.
\n\nسأعرض لكم ليس مجرد تعريفات جافة، بل سيناريوهات حقيقية من حياة مطور iOS. ستتعلم كيف يعمل تفاعل الشبكات في Swift على المستوى المنخفض (المقابس) والمستوى العالي (URLSession). وفي النهاية — مكافأة: كيفية توصيل WebSocket لدردشة مباشرة. هيا بنا!
\n\nفهم الأساسيات: كيف تعمل الشبكات في عالم Swift
\n\nقبل كتابة الكود، دعنا نفهم المفاهيم. برمجة الشبكات في Swift تستند إلى نفس المبادئ الموجودة في أي لغة أخرى: بنية الخادم والعميل، بروتوكولات TCP/UDP، عناوين IP والمنافذ. لكن هناك فارق — نظام Apple البيئي يقدم أطر العمل الخاصة به التي تجعل حياة المطور أسهل.
\n\nالتقنيات الرئيسية للعمل مع الشبكات في Swift
\n\n- \n
- URLSession — الأداة الرئيسية لطلبات HTTP/HTTPS. تعمل مع REST API، تحميل الملفات، المهام الخلفية. \n
- Network.framework — وصول منخفض المستوى إلى المقابس، TCP/UDP. ظهر في iOS 12، وحل محل CFNetwork القديم. \n
- WebSocket (URLSessionWebSocketTask) — للاتصال ثنائي الاتجاه في الوقت الفعلي. \n
- CFStream — طريقة قديمة ولكنها لا تزال حية للعمل مع تدفقات البيانات. \n
شخصيًا، أوصي بالبدء بـ URLSession — إنه مثل قيادة سيارة بناقل حركة أوتوماتيكي. وعندما ترغب في "الناقل اليدوي" — انتقل إلى Network.framework.
\n\nURLSession: صديقك الرئيسي في برمجة الشبكات Swift
\n\nلنبدأ بالأداة الأكثر شيوعًا. URLSession Swift هو إطار عمل قوي لإرسال واستقبال البيانات عبر الشبكة. يدعم التخزين المؤقت، المصادقة، التحميلات الخلفية وأكثر من ذلك بكثير.
\n\nطلب GET أساسي
\n\nتخيل أن تطبيقك يجب أن يعرض قائمة المستخدمين من الخادم. إليك كيف يتم ذلك:
\n\nimport Foundation\n\n// 1. إنشاء URL\nguard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else {\n fatalError("Invalid URL")\n}\n\n// 2. إنشاء مهمة\nlet task = URLSession.shared.dataTask(with: url) { data, response, error in\n // 3. معالجة الأخطاء\n if let error = error {\n print("خطأ: \\(error.localizedDescription)")\n return\n }\n \n // 4. التحقق من استجابة الخادم\n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n print("رمز حالة غير صحيح")\n return\n }\n \n // 5. العمل مع البيانات\n if let data = data {\n do {\n let users = try JSONDecoder().decode([User].self, from: data)\n print("تم استلام \\(users.count) مستخدم")\n } catch {\n print("خطأ في التحليل: \\(error)")\n }\n }\n}\n\n// 6. تشغيل المهمة\ntask.resume()\n\nلاحظ: task.resume() إلزامي! وإلا فلن يتم تنفيذ الطلب أبدًا. هذا خطأ شائع للمبتدئين في برمجة الشبكات في Swift.
طلب POST مع جسم
\n\nالآن سنرسل بيانات إلى الخادم:
\n\nfunc createUser(name: String, email: String) {\n guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else {\n return\n }\n \n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application/json", forHTTPHeaderField: "Content-Type")\n \n let body