הפעל בהדרגה את Firebase App Check באמצעות Firebase Remote Config

1. הקדמה

אתה יכול להשתמש ב-Firebase App Check עם App Attest כדי להגן על שירותי הקצה האחוריים שלך ולוודא שבקשות לשירותי Firebase מגיעות מהאפליקציה האותנטית שלך.

בדרך כלל מומלץ להכניס משתמשים בהדרגה לשירות App Attest כדי להימנע מפגיעה במגבלות המכסה. למידע נוסף, עיין בתיעוד " הכנה לשימוש בשירות אישור האפליקציה " של אפל.

היכולת לשחרר עדכוני אפליקציה בהדרגה באמצעות תכונת ה-App Store Connect של Apple, כמתואר ב"שחרור עדכון גרסה בשלבים ", יכולה להפוך את השקת App Check לחלקה יותר. זהו פתרון פשוט ופשוט. עם זאת, שחרור עדכון גרסת אפליקציה בשלבים אינו מאפשר לך לשלוט בהשקה או לשנות התנהגות של אפליקציות קיימות ומעודכנות מבלי לפרסם גרסת אפליקציה חדשה.

אחת הדרכים לקבל שליטה רבה יותר על השקת App Check with App Attest היא להשתמש ב-Firebase Remote Config כדי להפעיל App Check עם App Attest עבור אחוז ממשתמשי האפליקציה שלך בכל פעם. זה עשוי לסייע בהימנעות מצריבה משרתי האישורים. ניתן להשתמש ב-Google Analytics כדי לראות את ההשפעה של ההשקה על המשתמשים.

מה תלמד

במעבדת קוד מרובה שלבים זו, תלמד כיצד להשתמש בתצורה מרחוק של Firebase כדי להפעיל את App Check עבור האפליקציה שלך.

מעבד קוד זה משתמש בפרויקט Firebase המבוסס על אפליקציית ההתחלה המהירה DatabaseExample ומשולב עם Firebase App Check, כמתואר ב- Firebase App Check for Apple Platforms . אפליקציית ההתחלה המהירה של DatabaseExample מאפשרת למשתמשים להיכנס ולהוסיף פוסטים באמצעות התכונות של Firebase Realtime Database.

אתה יכול גם להתאים את השלבים במעבדת קוד זה כדי לבדוק את האפליקציה שלך.

דרישות מוקדמות

מה אתה צריך

2. צור ספק אישור מותאם אישית

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

כדי להשלים את השלבים הבאים, תצטרך להוסיף Firebase , FirebaseRemoteConfig ו- FirebaseAnalytics בקטע 'מסגרות', ספריות ותוכן מוטבע של האפליקציה שלך ב-Xcode. לדוגמא כיצד לעשות זאת, עיין בבדיקת מעבדת הקוד של אפליקציית Firebase עבור פלטפורמות Apple .

  1. צור קובץ " MyAppCheckProvider " שהוא תת-סיווג של NSObject התואם את פרוטוקול AppCheckProvider .
  2. כלול שיטה ריקה getToken() שתמלא מאוחר יותר.

ראה את הקוד לדוגמה הבא עבור מחלקת הספק המותאם אישית עם שיטת getToken() הריקה.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

כדי ליצור מופע AppAttestProvider , תצטרך להעביר מופע של FirebaseApp המתאים. צור עבורו מאפיין מאוחסן וקבל אותו כפרמטר אתחול:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

העבר את בקשת האסימון לספק App Attest

עכשיו יש לך הכל כדי להעביר את בקשת האסימון לספק App Attest בשיטת getToken() שלך.

הערה: למד עוד על שיטת getToken() ב- FirebaseAppCheck Framework Reference .

הוסף את הקוד הבא לשיטת getToken() שלך:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
    // Fetch App Attest flag from Remote Config
    let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
    remoteConfig.fetchAndActivate { remoteConfigStatus, error in
      // Get App Attest flag value
      let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

      guard appAttestEnabled else {
        // Skip attestation if App Attest is disabled. Another attestation
        // method like DeviceCheck may be used instead of just skipping.
        handler(nil, MyProviderError.appAttestIsDisabled)
        return
      }

      // Try to obtain an App Attest provider instance and fail if cannot
      guard let appAttestProvider = self.appAttestProvider else {
        handler(nil, MyProviderError.appAttestIsUnavailable)
        return
      }

      // If App Attest is enabled for the app instance, then forward the
      // Firebase App Check token request to the App Attest provider
      appAttestProvider.getToken(completion: handler)
    }
  }
}

enum MyProviderError: Error {
  case appAttestIsDisabled
  case appAttestIsUnavailable
  case unexpected(code: Int)
}

הקוד הקודם בודק פרמטר בוליאני AppAttestEnabled Remote Config (פרמטר Remote Config זה ייווצר מאוחר יותר במעבדת הקוד). אם הערך הוא שקר, הקוד נכשל, מה שמצביע על כך ש-App Check לא מתגלגל במכשיר הנוכחי. אם הערך נכון, הקוד מנסה להשיג ספק App Attest ונכשל אם הוא לא מצליח. אם בדיקות השגיאה הללו יעברו, הקוד יעביר את בקשת האסימון לספק App Attest.

הוסף אירועי Analytics

על ידי הוספת אירועים של Analytics, אתה מקבל תובנות טובות יותר לגבי מידת ההצלחה של השקת App Check. Analytics יעזור לקבוע אם App Attest צריך להיות מופעל עבור קהל גדול יותר.

רישום שני אירועי Analytics: AppAttestSuccess על הצלחה ו- AppAttestFailure על כישלון. שני אירועי Analytics אלה יכולים לעזור לעקוב אחר הצלחת השקת App Check שלך ולעזור לך להחליט אם יש להמשיך בהשקה גדולה יותר.

func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
  // Fetch Remote Config.
  let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
  remoteConfig.fetchAndActivate { remoteConfigStatus, error in
    // Get App Attest flag value from Remote Config.
    let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

    guard appAttestEnabled else {
      // Skip attestation if App Attest is disabled. Another attestation
      // method like DeviceCheck may be used instead of just skipping.
      handler(nil, MyProviderError.appAttestIsDisabled)
      return
    }

    // Try to obtain an App Attest provider instance and fail otherwise.
    guard let appAttestProvider = self.appAttestProvider else {
      handler(nil, MyProviderError.appAttestIsUnavailable)
      return
    }

    // If App Attest is enabled for the app instance, then forward the
    // Firebase App Check token request to the App Attest provider.
    appAttestProvider.getToken { token, error in
      // Log an Analytics event to track attestation success rate.
      let appAttestEvent: String
      if (token != nil && error == nil) {
        appAttestEvent = "AppAttestSuccess"
      } else {
        appAttestEvent = "AppAttestFailure"
      }
      Analytics.logEvent(appAttestEvent, parameters: nil)

      // Pass the result to the handler
      handler(token, error)
    }
  }
}

3. עדכן את המחלקה של ספק מפעל

לאחר שיישמת את ההיגיון להעביר את בקשת האסימון לספק App Attest והוספת כמה אירועי Analytics, עליך לעדכן את MyAppCheckProviderFactory.class שיצרת במעבדת הקוד של App Check for Apple Platforms . מחלקה זו תכוון לספק ניפוי באגים של App Check עבור סימולטורים, ובדרך אחרת תכוון לספק המותאם אישית שלך.

ערוך את הקוד הבא במחלקה MyAppCheckProviderFactory שיצרת במעבדת הקוד של Firebase App Check for platforms Apple :

// MyAppCheckProviderFactory.swift

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use your custom App Attest provider on real devices.
        return MyAppCheckProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

אשר שהגדרת את AppCheckProviderFactory לפני הגדרת FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. הוסף פרמטר Config מרחוק במסוף Firebase

כעת תוסיף את הפרמטר Remote Config AppAttestEnabled למסוף Firebase. שיטת getToken שלך דורשת פרמטר זה.

כדי ליצור פרמטר Config מרחוק במסוף Firebase:

  1. פתח את התצורה המרוחקת עבור הפרוייקט שלך ולחץ על הוסף פרמטר . אם זו הפעם הראשונה שאתה משתמש בתצורה מרחוק, לחץ על צור תצורה .
  2. בשדה שם פרמטר (מפתח) , הזן AppAttestEnabled .
  3. מהתפריט הנפתח סוג נתונים , בחר בוליאני .
  4. מהתפריט הנפתח ערך ברירת מחדל, בחר false .

יצירת פרמטר תצורה מרחוק במסוף Firebase

לפני לחיצה על שמור, צור ערך מותנה עבור 10% מהמשתמשים:

  1. לחץ על הוסף חדש > ערך מותנה > צור תנאי חדש .
  2. בשדה שם , הזן שם תנאי.
  3. תחת חל אם... , בחר משתמש באחוזון אקראי , <= , ולאחר מכן הזן 10 בשדה % .
  4. לחץ על צור תנאי .

הגדרת מצב תצורה מרחוק במסוף Firebase

הגדר את הערך המותנה ל- true כך ש-App Attest יושק ל-10% מהמשתמשים שלך.

  1. הגדר את הערך ל- true עבור התנאי שזה עתה יצרת.
  2. לחץ על שמור .

סקירת פרמטר Config מרחוק במסוף Firebase

כשתסיים, פרסם את השינויים בתצורה מרחוק.

בדוק את ההשקה במכשיר שלך

כדי לבדוק את ערכי הדגל השונים של תצורה מרוחקת במכשיר שלך מבלי לשנות את קוד האפליקציה, הגדר ניסוי בפרמטר AppAttestEnabled בעקבות המדריך צור Firebase Remote Config Experiments with A/B Testing . קטע ההדרכה " אמת את הניסוי שלך במכשיר בדיקה " מסביר כיצד להקצות ערכים שונים למכשיר הבדיקה שלך.

השלב האחרון הוא להשתמש ב-Google Analytics כדי לעקוב אחר הצלחת השקת App Attest שלך.

5. סקור את הצלחת השקת AppCheck שלך

אתה יכול למדוד את הצלחת ההשקה שלך בלוח המחוונים של Analytics Events. צפו באירועי AppAttestSuccess ו- AppAttestFailure . ייתכן שיחלפו עד 24 שעות לראות אירועים בלוח המחוונים. לחלופין, תוכל להפעיל איתור באגים ולהשתמש ב-DebugView כדי לראות אירועי ניפוי באגים מהר יותר.

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

ברגע שאתה רואה בעיקר אירועי AppAttestSuccess ומעט אירועי AppAttestFailure , זה סימן טוב שאתה יכול להגדיל את אחוז המשתמשים עם App Attest מופעל על ידי שינוי התנאי בפרמטר Remote Config AppAttestEnabled .

סקירת אירועים של Analytics במסוף Firebase

אופציונלי: נצל את הקהל של Google Analytics

אם ברצונך למנף עוד יותר את אירוע AppAttestEnabled Analytics, תוכל ליצור קהל ב-Analytics למעקב אחר משתמשים כאשר AppAttestEnabled מוגדר כ-true.

App Attest שוחרר עם iOS 14.0. ייתכן שחלק מהמשתמשים שלך אינם בגרסה זו, ולכן אינם זכאים ל-App Attest. אתה יכול לרשום אירוע אחר ב-Analytics כדי לעקוב אחר משתמשים אלה, ואז למקד לקהל זה לשיטת אישור אחרת, כגון DeviceCheck .

אופציונלי: השתמש ב-Cashlytics כדי לנטר קריסות

כדי להבין טוב יותר את היציבות של האפליקציה שלך במהלך ההשקה, השתמש ב- Firebase Crashlytics כדי לנטר קריסות וללא קטלניות.

6. מזל טוב!

השקת בהצלחה את App Check עם Remote Config 🎉

משאבים נוספים: