مقدمة: لماذا GraphQL وSwift؟
تتطلب تطوير تطبيقات iOS وmacOS الحديثة طرقًا مرنة وفعالة للتفاعل مع الخادم. غالبًا ما تؤدي واجهات REST API التقليدية إلى مشكلة over-fetching (الحصول على بيانات زائدة) أو under-fetching (نقص البيانات). GraphQL يحل هذه المشكلات من خلال السماح للعميل بطلب البيانات التي يحتاجها فقط، في طلب واحد.
في هذا البرنامج التعليمي، سنقوم بإنشاء تطبيق كامل بلغة Swift يتفاعل مع GraphQL API. ستتعلم كيفية إعداد المشروع، وتنفيذ الاستعلامات، والتحويرات (mutations)، ومعالجة الأخطاء. سنستخدم Apollo iOS كعميل، وهي المكتبة الأكثر شيوعًا للعمل مع GraphQL في نظام Apple البيئي.
إعداد المشروع وتثبيت Apollo iOS
إنشاء مشروع جديد
افتح Xcode وأنشئ مشروعًا جديدًا لتطبيق iOS أو macOS. سمِّه GraphQLDemo.
تثبيت Apollo iOS عبر Swift Package Manager
- في Xcode، انتقل إلى File → Add Packages...
- الصق رابط مستودع Apollo:
https://github.com/apollographql/apollo-ios.git - اختر أحدث إصدار مستقر واضغط Add Package.
- تأكد من إضافة الحزمة إلى target الخاص بتطبيقك.
توليد الكود بناءً على مخطط GraphQL
يستخدم Apollo توليد الكود لإنشاء فئات آمنة من حيث النوع (type-safe). لهذا نحتاج إلى ملف المخطط (schema.graphqls) وملفات الاستعلامات (.graphql).
أنشئ مجلدًا باسم GraphQL في المشروع وضع فيه:
schema.graphqls— قم بتنزيل مخطط API الخاص بك أو استخدم مخططًا عامًا (مثل Countries GraphQL API).Queries.graphql— ملف يحتوي على استعلاماتك.
مثال لمحتوى Queries.graphql:
query GetCountries {
countries {
code
name
capital
currency
}
}
الآن أضف Build Phase لتوليد الكود. في Xcode: Target → Build Phases → + → New Run Script Phase. الصق السكريبت التالي:
cd "${SRCROOT}/${TARGET_NAME}"
./Pods/Apollo/scripts/run-bundled-codegen.sh codegen:generate --target=swift --includes=./**/*.graphql --localSchemaFile=./schema.graphqls ./GraphQL/API.swift
ملاحظة: في الإصدارات الحديثة من Apollo iOS، يُستخدم apollo-ios-cli. نوصي بالاطلاع على الوثائق الرسمية للحصول على أحدث التعليمات.
تنفيذ استعلامات GraphQL (Queries)
تهيئة عميل Apollo
لننشئ مديرًا للعمل مع Apollo. افتح ملف NetworkManager.swift:
import Foundation
import Apollo
class NetworkManager {
static let shared = NetworkManager()
private(set) lazy var apollo: ApolloClient = {
let url = URL(string: "https://countries.trevorblades.com/")!
return ApolloClient(url: url)
}()
}
تنفيذ الاستعلام
الآن لننفذ استعلام GetCountries في ViewController الخاص بنا:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fetchCountries()
}
private func fetchCountries() {
NetworkManager.shared.apollo.fetch(query: GetCountriesQuery()) { result in
switch result {
case .success(let graphQLResult):
if let countries = graphQLResult.data?.countries {
for country in countries {
print("\(country.name) - \(country.capital ?? "N/A")")
}
}
```