مقدمة: لماذا GraphQL و Swift ثنائي مثالي
تطوير iOS الحديث لا يمكن تصوره دون تفاعل فعال مع الخادم. REST API يفسح المجال تدريجياً لتقنية أكثر مرونة وأداءً — GraphQL. في هذا البرنامج التعليمي، سنشرح كيفية دمج GraphQL API في تطبيق Swift عملياً باستخدام مكتبة Apollo iOS.
GraphQL يتيح طلب البيانات المطلوبة بالضبط — لا أكثر ولا أقل. بالنسبة لـ Swift، هذا يعني تقليل حركة المرور، تسريع الأداء، وتبسيط الكود. سنمر بالمسار الكامل: من إعداد المشروع إلى تنفيذ الاستعلامات والتحورات المعقدة.
1. إعداد المشروع وتثبيت Apollo iOS
الخطوة الأولى — تجهيز مشروع Xcode وتثبيت التبعيات. الطريقة الأكثر ملاءمة هي عبر Swift Package Manager.
1.1 إنشاء مشروع جديد
افتح Xcode وأنشئ مشروعاً جديداً (تطبيق iOS أو تطبيق macOS). اختر SwiftUI أو UIKit — ليس مهماً. سمِّه GraphQLDemo.
1.2 إضافة Apollo iOS عبر SPM
- في Xcode، انتقل إلى: File → Add Package Dependencies...
- أدخل رابط المستودع:
https://github.com/apollographql/apollo-ios.git - اختر أحدث إصدار مستقر واضغط Add Package.
- تأكد من إضافة الحزمة إلى هدف تطبيقك.
1.3 توليد كود المخطط
Apollo iOS يستخدم توليد الكود. لهذا نحتاج إلى ملف المخطط .graphqls (يُحمَّل عادة من الخادم) وملفات الاستعلامات .graphql.
// هيكل المشروع:// GraphQLDemo/// ├── GraphQL/// │ ├── schema.graphqls // مخطط الخادم// │ ├── Queries.graphql // الاستعلامات// │ └── Mutations.graphql // التحوراتبعد إضافة الملفات، شغِّل توليد الكود عبر الطرفية:
cd /path/to/project./Pods/Apollo/apollo-ios-cli --download-schema --endpoint=https://your-server/graphql./Pods/Apollo/apollo-ios-cli --generateالآن لديك ملفات Swift مُولَّدة تحتوي على الأنواع والاستعلامات.
2. استعلام أساسي (Query) في Swift
سنشرح أبسط استعلام لجلب قائمة المستخدمين. لنفترض أن مخططنا يحتوي على نوع User مع الحقول id، name، email.
2.1 إنشاء ملف .graphql
في مجلد GraphQL، أنشئ ملفاً باسم Queries.graphql:
query GetUsers { users { id name email }}2.2 تنفيذ الاستعلام في Swift
أولاً، قم بتهيئة عميل Apollo:
import Apollo
class NetworkManager { static let shared = NetworkManager() let apollo: ApolloClient private init() { let url = URL(string: "https://your-server/graphql")! apollo = ApolloClient(url: url) }}الآن نفذ الاستعلام في أي ViewController أو ViewModel:
import SwiftUI
struct UsersView: View { @State private var users: [GetUsersQuery.Data.User] = [] var body: some View { List(users, id: \\.id) { user in VStack(alignment: .leading) { Text(user.name) .font(.headline) Text(user.email) .font(.subheadline) .foregroundColor(.gray) } } .onAppear { loadUsers() } } private func loadUsers() { NetworkManager.shared.apollo.fetch(query: GetUsersQuery()) { result in switch result { case .success(let graphQLResult): if let usersData = graphQLResult.data?.users { self.users = usersData } case .failure(let error): print("خطأ: \\(error.localizedDescri")