مكتبة Apollo iOS للعمل مع GraphQL بلغة Swift
Apollo iOS هي مكتبة قوية ومرنة للعمل مع GraphQL في نظام Apple البيئي. توفر لمطوري iOS و macOS أداة مريحة لتنفيذ الاستعلامات والتحويرات والاشتراكات على خوادم GraphQL. على عكس REST API، يسمح GraphQL للعميل بطلب البيانات الضرورية فقط، مما يقلل من حجم حركة المرور ويسرّع عمل التطبيقات. تدعم Apollo iOS بشكل كامل لغة Swift، بما في ذلك الإمكانيات الحديثة للغة مثل async/await و Combine و SwiftUI.
الإمكانيات الرئيسية لـ Apollo iOS
- توليد الكود: إنشاء تلقائي لنماذج بيانات آمنة من حيث النوع بناءً على مخطط GraphQL.
- التخزين المؤقت: دعم مدمج لذاكرة تخزين مؤقت طبيعية لتحسين الاستعلامات المتكررة.
- دعم Swift Concurrency: تكامل كامل مع async/await للعمليات غير المتزامنة.
- الاشتراكات عبر WebSocket: تنفيذ التحديثات في الوقت الفعلي باستخدام GraphQL subscriptions.
- Combine و SwiftUI: إمكانية الاستخدام مع أطر العمل التفاعلية من Apple.
- تعدد المنصات: يعمل على iOS و macOS و tvOS و watchOS.
تثبيت المكتبة
لتثبيت Apollo iOS، استخدم Swift Package Manager. أضف الحزمة في Xcode عبر القائمة File → Add Packages وحدد الرابط:
https://github.com/apollographql/apollo-ios.gitالإصدار: آخر إصدار مستقر (عند وقت الكتابة — 1.15.0).
إعداد Apollo Client
الخطوة الأولى هي إنشاء مثيل من ApolloClient مع رابط خادم GraphQL الخاص بك. مثال على الإعداد الأساسي:
import Apollo
class NetworkService { static let shared = NetworkService() private(set) lazy var apollo: ApolloClient = { let url = URL(string: "https://api.example.com/graphql")! return ApolloClient(url: url) }()}تنفيذ الاستعلامات (Queries)
يقوم Apollo iOS بتوليد الكود بناءً على مخطط GraphQL. أولاً، حدد الاستعلام في ملف .graphql:
query GetUser($id: ID!) { user(id: $id) { id name email posts { title } }}بعد توليد الكود، قم بتنفيذ الاستعلام:
import Apollo
func fetchUser(id: String) async throws -> GetUserQuery.Data.User? { let query = GetUserQuery(id: id) let result = try await NetworkService.shared.apollo.fetch(query: query) return result.data?.user}التحويرات (Mutation)
لتغيير البيانات، استخدم التحويرات. مثال على إنشاء منشور جديد:
mutation CreatePost($title: String!, $content: String!) { createPost(input: { title: $title, content: $content }) { id title createdAt }}تنفيذ التحوير في Swift:
func createPost(title: String, content: String) async throws -> CreatePostMutation.Data.CreatePost? { let mutation = CreatePostMutation(title: title, content: content) let result = try await NetworkService.shared.apollo.perform(mutation: mutation) return result.data?.createPost}العمل مع الاشتراكات (Subscriptions)
للتحديثات في الوقت الفعلي، استخدم الاشتراكات. مثال على الاشتراك في الرسائل الجديدة:
subscription OnNewMessage { newMessage { id text sender { name } }}التنفيذ في Swift باستخدام Combine:
import Combine
var cancellables = Set<AnyCancellable>()
func subscribeToMessages() { let subscription = OnNewMessageSubscription() NetworkService.shared.apollo.subscribe(subscription: subscription) .sink { completion in print("Subscription