שימוש בערכות SDK שנוצרו על ידי iOS

ערכות ה-SDK ללקוח של Firebase Data Connect מאפשרות לכם לקרוא ישירות שאילתות ושינויים בצד השרת מאפליקציית Firebase. אתם יוצרים SDK מותאם אישית ללקוח במקביל לעיצוב הסכימות, השאילתות והשינויים שאתם פורסים בשירות Firebase Data Connect.Data Connect לאחר מכן, משלבים שיטות מ-SDK זה בלוגיקה של הלקוח.

כמו שציינו במקומות אחרים, חשוב לזכור שData Connect שאילתות ומוטציות לא נשלחות על ידי קוד לקוח ומופעלות בשרת. במקום זאת, כשפורסים את הפונקציה, הפעולות של Data Connect מאוחסנות בשרת כמו ב-Cloud Functions. כלומר, צריך להטמיע שינויים תואמים בצד הלקוח כדי למנוע שיבוש של משתמשים קיימים (לדוגמה, בגרסאות ישנות יותר של האפליקציה).

לכן Data Connect מספקת לכם סביבת פיתוח וכלים שמאפשרים לכם ליצור אב טיפוס של סכימות, שאילתות ומוטציות שמוצבות בשרת. בנוסף, המערכת יוצרת באופן אוטומטי ערכות SDK בצד הלקוח בזמן שאתם יוצרים אב טיפוס.

אחרי שחוזרים על תהליך העדכון של השירות ושל אפליקציות הלקוח, העדכונים בצד השרת ובצד הלקוח מוכנים לפריסה.

מהו תהליך העבודה לפיתוח לקוחות?

אם פעלתם לפי השלבים במאמר תחילת העבודה, קיבלתם הסבר על תהליך הפיתוח הכולל של Data Connect. במדריך הזה מופיע מידע מפורט יותר על יצירת ערכות SDK של Swift מהסכימה שלכם ועל עבודה עם שאילתות ומוטציות של לקוחות.

לסיכום, כדי להשתמש בערכות Swift SDK שנוצרו באפליקציות הלקוח, צריך לבצע את השלבים המקדימים הבאים:

  1. מוסיפים את Firebase לאפליקציית iOS.
  2. כדי להשתמש ב-SDK שנוצר, צריך להגדיר אותו כתלות ב-Xcode.

    בסרגל הניווט העליון של Xcode, בוחרים באפשרות File > Add Package Dependencies > Add Local (קובץ > הוספת תלות בחבילה > הוספה מקומית), ובוחרים את התיקייה שמכילה את הקובץ Package.swift שנוצר.

לאחר מכן:

  1. פיתוח סכימת האפליקציה.
  2. מגדירים יצירת SDK:

  3. מאתחלים את קוד הלקוח ומייבאים ספריות.

  4. מטמיעים קריאות לשאילתות ולמוטציות.

  5. מגדירים את האמולטור Data Connect ומשתמשים בו וחוזרים על התהליך.

יצירת Swift SDK

משתמשים ב-Firebase CLI כדי להגדיר ערכות SDK שנוצרו על ידי Data Connect באפליקציות. הפקודה init אמורה לזהות את כל האפליקציות בתיקייה הנוכחית ולהתקין באופן אוטומטי את ה-SDK שנוצר.

firebase init dataconnect:sdk

עדכון ערכות SDK במהלך יצירת אב טיפוס

אם התקנתם את התוסף Data Connect VS Code, הוא תמיד ידאג לעדכן את ערכות ה-SDK שנוצרו.

אם אתם לא משתמשים בתוסף Data Connect VS Code, אתם יכולים להשתמש ב-Firebase CLI כדי לעדכן את ה-SDK שנוצר.

firebase dataconnect:sdk:generate --watch

יצירת ערכות SDK בצינורות עיבוד נתונים

אתם יכולים להשתמש ב-Firebase CLI כדי ליצור Data Connect SDK בתהליכי בנייה של CI/CD.

firebase dataconnect:sdk:generate

אתחול Data Connect iOS SDK

מאתחלים את המופע של Data Connect באמצעות המידע שבו השתמשתם כדי להגדיר את Data Connect (כל המידע זמין בכרטיסייה Data Connect במסוף Firebase).

קבלת מופע של מחבר

הקוד של המחבר ייווצר על ידי האמולטור Data Connect. אם שם המחבר הוא movies והחבילה היא movies, כמו שצוין ב-connector.yaml, צריך לאחזר את אובייקט המחבר באמצעות הקריאה:

let connector = DataConnect.moviesConnector

הטמעה של שאילתות ומוטציות

באמצעות אובייקט המחבר, אפשר להריץ שאילתות ושינויים כמו שמוגדר בקוד המקור של GraphQL. נניח שהמחבר שלכם כולל את הפעולות הבאות:

mutation createMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
  movie_insert(data: {
    title: $title
    releaseYear: $releaseYear
    genre: $genre
    rating: $rating
  })
}

query getMovieByKey($key: Movie_Key!) {
  movie(key: $key) { id title }
}

query listMoviesByGenre($genre: String!) {
  movies(where: {genre: {eq: $genre}}) {
    id
    title
  }
}

אחרי כן תוכלו ליצור סרט באופן הבא:

let mutationResult = try await connector.createMovieMutation.execute(
  title: "Empire Strikes Back",
  releaseYear: 1980,
  genre: "Sci-Fi",
  rating: 5)

print("Movie ID: \(mutationResult.data.movie_insert.id)")

כדי לאחזר סרט, תשתמשו בהפניה לשאילתה. כל ההפניות לשאילתות הן מקורות Observable. בהתאם להגדרות של בעל האתר (ראו connector.yaml)), הוא תומך בפקודת המאקרו @Observable (iOS 17 ואילך) או מיישם את ObservableObjectהפרוטוקול. אם לא מציינים ערך, ברירת המחדל היא פקודת המאקרו @Observable שנתמכת ב-iOS 17 ואילך.

בתצוגת SwiftUI, אפשר לקשר את תוצאות השאילתה באמצעות המשתנה data שפורסם של הפניה לשאילתה, ולקרוא לשיטה execute() של השאילתה כדי לעדכן את הנתונים. המשתנה data יתאים לצורת הנתונים שהוגדרה בהגדרת שאילתת GQL.

כל התוצאות שאוחזרו תואמות לפרוטוקול Decodable. אם כללתם את המפתח הראשי של האובייקט באחזור GQL, האובייקטים הם גם Identifiable, כך שתוכלו להשתמש בהם באיטרטורים.

struct ListMovieView: View {
    @StateObject private var queryRef = connector.listMoviesByGenreQuery.ref(genre: "Sci-Fi")
    var body: some View {
        VStack {
            Button {
                Task {
                    do {
                        try await refresh()
                    } catch {
                        print("Failed to refresh: \(error)")
                    }
                }
            } label: {
                Text("Refresh")
            }
                // use the query results in a view
            ForEach(queryRef.data?.movies ?? [], id: \.self.id) { movie in
                    Text(movie.title)
                }
            }
    }
    @MainActor
    func refresh() async throws {
        _ = try await queryRef.execute()
    }
}

השאילתות תומכות גם בביצוע חד-פעמי.

let resultData = try await DataConnect.moviesConnector.listMoviesByGenreQuery.execute(genre: "Sci-Fi")

טיפול בשינויים בשדות של ספירה

סכימה של אפליקציה יכולה להכיל מניינים שאפשר לגשת אליהם באמצעות שאילתות GraphQL.

יכול להיות שתוסיפו ערכים חדשים של enum נתמכים ככל שהעיצוב של האפליקציה ישתנה. לדוגמה, נניח שבהמשך מחזור החיים של האפליקציה, אתם מחליטים להוסיף ערך FULLSCREEN לספירה AspectRatio.

בתהליך העבודה של Data Connect, אפשר להשתמש בכלים לפיתוח מקומי כדי לעדכן את השאילתות ואת ערכות ה-SDK.

עם זאת, לפני שאתם משיקים גרסה מעודכנת של הלקוחות, יכול להיות שגרסאות ישנות יותר של לקוחות שכבר נפרסו יפסיקו לפעול.

דוגמה להטמעה עמידה

ה-SDK שנוצר מחייב טיפול בערכים לא ידועים, כי ה-enums שנוצרו מכילים ערך _UNKNOWN, ו-Swift מחייבת הצהרות switch מקיפות.

do {
    let result = try await DataConnect.moviesConnector.listMovies.execute()
    if let data = result.data {
        for movie in data.movies {
            switch movie.aspectratio {
                case .ACADEMY: print("academy")
                case .WIDESCREEN: print("widescreen")
                case .ANAMORPHIC: print("anamorphic")
                case ._UNKNOWN(let unknownAspect): print(unknownAspect)
            }
        }
    }
} catch {
    // handle error
}

הפעלת שמירת נתונים במטמון בצד הלקוח

ל-Data Connect יש תכונה אופציונלית של שמירת נתונים במטמון בצד הלקוח, שאפשר להפעיל אותה על ידי עריכת הקובץ connector.yaml. כשהתכונה הזו מופעלת, ערכות ה-SDK של הלקוח שנוצרות שומרות במטמון באופן מקומי את התשובות לשאילתות. כך אפשר לצמצם את מספר הבקשות למסד הנתונים שהאפליקציה שולחת, ולאפשר לחלקים באפליקציה שתלויים במסד הנתונים לפעול גם כשאין חיבור לרשת.

כדי להפעיל שמירה במטמון בצד הלקוח, מוסיפים הגדרה של שמירה במטמון בצד הלקוח להגדרת המחבר:

generate:
  swiftSdk:
    outputDir: "../ios"
    package: "FirebaseDataConnectGenerated"
    clientCache:
      maxAge: 5s
      storage: persistent

להגדרה הזו יש שני פרמטרים, שניהם אופציונליים:

  • maxAge: הגיל המקסימלי של תגובה שנשמרה במטמון לפני שערכת ה-SDK של הלקוח מאחזרת ערכים חדשים. דוגמאות: '0',‏ '30s',‏ '1h30m'.

    ערך ברירת המחדל של maxAge הוא 0, כלומר התשובות נשמרות במטמון, אבל ה-SDK של הלקוח תמיד יביא ערכים חדשים. הערכים שנשמרו במטמון ישמשו רק אם המשתנה CACHE_ONLY מוגדר כ-execute().

  • storage: אפשר להגדיר את ה-SDK של הלקוח כך שיאחסן תשובות במטמון באחסון של persistent או ב-memory. התוצאות שנשמרות במטמון באחסון של persistent יישארו גם אחרי הפעלה מחדש של האפליקציה. ב-iOS SDKs, ברירת המחדל היא persistent.

אחרי שמעדכנים את הגדרות השמירה במטמון של המחבר, צריך ליצור מחדש את ה-SDK של הלקוח ולבנות מחדש את האפליקציה. לאחר מכן, execute() ישמור במטמון את התגובות וישתמש בערכים שנשמרו במטמון בהתאם למדיניות שהגדרתם. בדרך כלל זה קורה באופן אוטומטי, בלי שתצטרכו לבצע פעולות נוספות. עם זאת, חשוב לשים לב לנקודות הבאות:

  • התנהגות ברירת המחדל של execute() היא כפי שמתואר למעלה: אם תוצאה נשמרת במטמון עבור שאילתה והערך במטמון לא ישן יותר מ-maxAge, המערכת משתמשת בערך במטמון. פעולת ברירת המחדל הזו נקראת מדיניות PREFER_CACHE.

    אפשר גם לציין הפעלות ספציפיות של execute() כדי להציג רק ערכים שמורים במטמון (CACHE_ONLY) או כדי לאחזר ערכים חדשים מהשרת ללא תנאי (SERVER_ONLY).

    try await execute(fetchPolicy: .cacheOnly)
    
    try await execute(fetchPolicy: .serverOnly)
    

    יצירת אב-טיפוס ובדיקה של אפליקציית iOS

    הגדרת לקוחות לשימוש באמולטור מקומי

    אתם יכולים להשתמש באמולטור Data Connect, דרך התוסף Data Connect VS Code או דרך ה-CLI.

    התהליך של הוספת קוד לאפליקציה כדי להתחבר לאמולטור זהה בשני התרחישים.

    let connector = DataConnect.moviesConnector
    // Connect to the emulator on "127.0.0.1:9399"
    connector.useEmulator()
    
    // (alternatively) if you're running your emulator on non-default port:
    connector.useEmulator(port: 9999)
    
    // Make calls from your app
    

    סוגי נתונים בערכות Data Connect SDK

    השרת Data Connect מייצג סוגי נתונים נפוצים ומותאמים אישית של GraphQL. הם מיוצגים ב-SDK באופן הבא.

    Data Connect סוג Swift
    מחרוזת מחרוזת
    Int Int
    Float זוגית
    בוליאני בוליאני
    מזהה ייחודי אוניברסלי (UUID) מזהה ייחודי אוניברסלי (UUID)
    תאריך FirebaseDataConnect.LocalDate
    חותמת זמן FirebaseCore.Timestamp
    Int64 Int64
    הכול FirebaseDataConnect.AnyValue