Stopniowo wdrażaj Sprawdzanie aplikacji Firebase za pomocą zdalnej konfiguracji Firebase

1. Wstęp

Możesz użyć Firebase App Check z App Attest, aby chronić swoje usługi backendu i sprawdzić, czy żądania do usług Firebase pochodzą z Twojej autentycznej aplikacji.

Ogólnie zaleca się stopniowe dołączanie użytkowników do usługi App Attest, aby uniknąć przekroczenia limitów przydziału. Więcej informacji można znaleźć w dokumentacji firmy Apple „ Przygotowanie do korzystania z usługi App Attest Service ”.

Możliwość stopniowego udostępniania aktualizacji aplikacji za pomocą funkcji App Store Connect firmy Apple, zgodnie z opisem w sekcji „ Fazowe udostępnianie aktualizacji wersji ” może sprawić, że wdrażanie sprawdzania aplikacji będzie przebiegać płynniej. To jest proste, proste rozwiązanie. Jednak udostępnianie aktualizacji wersji aplikacji etapami nie pozwala kontrolować wdrażania ani zmieniać zachowania istniejących, zaktualizowanych aplikacji bez publikowania nowej wersji aplikacji.

Jednym ze sposobów zapewnienia większej kontroli nad wdrożeniem Sprawdzania aplikacji za pomocą narzędzia App Attest jest użycie funkcji zdalnej konfiguracji Firebase w celu jednoczesnego włączenia Sprawdzania aplikacji za pomocą narzędzia App Attest dla określonego odsetka użytkowników aplikacji. Może to pomóc w uniknięciu ograniczania wydajności serwerów atestacyjnych. Google Analytics można wykorzystać do obserwacji wpływu wdrożenia na użytkowników.

Czego się dowiesz

Podczas tych wieloetapowych ćwiczeń z programowania dowiesz się, jak używać funkcji zdalnej konfiguracji Firebase do wdrażania sprawdzania aplikacji w swojej aplikacji.

To ćwiczenie z programowania korzysta z projektu Firebase opartego na aplikacji szybkiego startu DatabaseExample i zintegrowanego z Firebase App Check, zgodnie z opisem w ćwiczeniach z programowania Firebase App Check dla platform Apple . Aplikacja szybkiego startu DatabaseExample umożliwia użytkownikom logowanie się i dodawanie postów przy użyciu funkcji bazy danych Firebase Realtime Database.

Możesz także dostosować kroki opisane w tym ćwiczeniu z programowania, aby przetestować własną aplikację.

Warunki wstępne

Co będziesz potrzebował

2. Utwórz niestandardowego dostawcę atestów

W tym kroku utworzymy niestandardową klasę dostawcy, która będzie udostępniać token tylko wtedy, gdy włączono funkcję App Attest. Zdalna konfiguracja opiera się na skonfigurowanej instancji aplikacji Firebase, a niestandardowy dostawca zaimplementowany w tym kroku pełni rolę obiektu zastępczego umożliwiającego zakończenie konfiguracji.

Aby wykonać poniższe kroki, musisz dodać Firebase , FirebaseRemoteConfig i FirebaseAnalytics w sekcji Frameworks, Libraries i Embedded Content swojej aplikacji w Xcode. Przykład tego można znaleźć w ćwiczeniach z zakresu sprawdzania aplikacji Firebase w zakresie platform Apple .

  1. Utwórz plik „ MyAppCheckProvider ” będący podklasą NSObject zgodną z protokołem AppCheckProvider .
  2. Dołącz pustą metodę getToken() , którą wypełnisz później.

Zobacz poniższy przykładowy kod niestandardowej klasy dostawcy z pustą metodą getToken() .

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

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

Aby utworzyć instancję AppAttestProvider , musisz przekazać instancję odpowiedniego FirebaseApp . Utwórz dla niego zapisaną właściwość i zaakceptuj ją jako parametr inicjujący:

// 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) {}
}

Prześlij żądanie tokenu do dostawcy certyfikatu aplikacji

Teraz masz wszystko, aby przekazać żądanie tokenu do dostawcy App Attest w metodzie getToken() .

Uwaga: więcej informacji na temat metody getToken() można znaleźć w dokumencie FirebaseAppCheck Framework Reference .

Dodaj następujący kod do metody 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)
}

Poprzedni kod sprawdza parametr logiczny Remote Config AppAttestEnabled (ten parametr Remote Config zostanie utworzony w dalszej części zajęć z programowania). Jeśli wartość ma wartość false, kod zakończy się niepowodzeniem, co oznacza, że ​​na bieżącym urządzeniu nie wdrożono sprawdzania aplikacji. Jeśli wartość ma wartość true, kod próbuje uzyskać dostawcę atestu aplikacji, ale kończy się niepowodzeniem, jeśli nie jest to możliwe. Jeśli te kontrole błędów zostaną pomyślnie zakończone, kod przekaże żądanie tokenu do dostawcy certyfikatu aplikacji.

Dodaj zdarzenia Analytics

Dodając zdarzenia Analytics, uzyskasz lepszy wgląd w skuteczność wdrożenia Sprawdzania aplikacji. Analityka pomoże określić, czy test aplikacji powinien zostać włączony dla większej liczby odbiorców.

Rejestruj dwa zdarzenia Analytics: AppAttestSuccess w przypadku powodzenia i AppAttestFailure w przypadku niepowodzenia. Te dwa zdarzenia Analytics mogą pomóc w śledzeniu powodzenia wdrożenia Sprawdzania aplikacji i podjęciu decyzji, czy należy kontynuować wdrożenie na większą skalę.

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. Zaktualizuj klasę Provider Factory

Po zaimplementowaniu logiki polegającej na przekazywaniu żądania tokenu do dostawcy App Attest i dodaniu kilku zdarzeń Analytics należy zaktualizować MyAppCheckProviderFactory.class utworzoną w ramach zajęć z programowania App Check for Apple Platforms . Ta klasa będzie przeznaczona dla dostawcy debugowania sprawdzania aplikacji dla symulatorów, a w przeciwnym razie będzie przeznaczona dla dostawcy niestandardowego.

Edytuj następujący kod w klasie MyAppCheckProviderFactory utworzonej podczas zajęć z programowania Firebase App Check dla platform 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
  }
}

Potwierdź, że ustawiłeś AppCheckProviderFactory przed skonfigurowaniem FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

4. Dodaj parametr Remote Config w konsoli Firebase

Teraz dodasz parametr AppAttestEnabled zdalnej konfiguracji do konsoli Firebase. Twoja metoda getToken wymaga tego parametru.

Aby utworzyć parametr Remote Config w konsoli Firebase:

  1. Otwórz Zdalną konfigurację swojego projektu i kliknij Dodaj parametr . Jeśli po raz pierwszy korzystasz ze zdalnej konfiguracji, kliknij opcję Utwórz konfigurację .
  2. W polu Nazwa parametru (klucz) wprowadź AppAttestEnabled .
  3. Z listy rozwijanej Typ danych wybierz opcję Boolean .
  4. Z listy rozwijanej Wartość domyślna wybierz opcję false .

Tworzenie parametru zdalnej konfiguracji w konsoli Firebase

Przed kliknięciem Zapisz utwórz wartość warunkową dla 10% użytkowników:

  1. Kliknij opcję Dodaj nowy > Wartość warunkowa > Utwórz nowy warunek .
  2. W polu Nazwa wprowadź nazwę warunku.
  3. W sekcji Stosuje się, jeśli... wybierz opcję Użytkownik w losowym percentylu , <= , a następnie wprowadź 10 w polu % .
  4. Kliknij opcję Utwórz warunek .

Definiowanie warunku zdalnej konfiguracji w konsoli Firebase

Ustaw wartość warunkową na true , aby aplikacja App Attest została wdrożona u 10% użytkowników.

  1. Ustaw wartość na true dla właśnie utworzonego warunku.
  2. Kliknij Zapisz .

Przeglądanie parametru Remote Config w konsoli Firebase

Kiedy skończysz, opublikuj zmiany w Zdalnej konfiguracji.

Przetestuj wdrożenie na swoim urządzeniu

Aby przetestować różne wartości flagi zdalnej konfiguracji na swoim urządzeniu bez modyfikowania kodu aplikacji, skonfiguruj eksperyment dla parametru AppAttestEnabled , postępując zgodnie z samouczkiem Tworzenie eksperymentów zdalnej konfiguracji Firebase za pomocą testów A/B . W sekcji samouczka „ Zweryfikuj swój eksperyment na urządzeniu testowym ” wyjaśniono, jak przypisać różne wartości do urządzenia testowego.

Ostatnim krokiem jest użycie Google Analytics do monitorowania powodzenia wdrożenia narzędzia App Attest.

5. Sprawdź skuteczność wdrożenia AppCheck

Możesz mierzyć powodzenie wdrożenia na panelu zdarzeń Analytics. Obserwuj zdarzenia AppAttestSuccess i AppAttestFailure . Wyświetlenie zdarzeń na pulpicie nawigacyjnym może zająć do 24 godzin. Alternatywnie możesz włączyć debugowanie i użyć DebugView, aby szybciej zobaczyć zdarzenia debugowania.

Opcjonalnie możesz monitorować pulpit Crashlytics pod kątem wzrostu liczby awarii. Więcej informacji na temat dodawania Crashlytics do swojej aplikacji znajdziesz w artykule Pierwsze kroki z Firebase Crashlytics .

Gdy zobaczysz głównie zdarzenia AppAttestSuccess i kilka zdarzeń AppAttestFailure , jest to dobry znak, że możesz zwiększyć odsetek użytkowników z włączoną funkcją App Attest, modyfikując warunek w parametrze zdalnej konfiguracji AppAttestEnabled .

Przeglądanie zdarzeń Analytics w konsoli Firebase

Opcjonalnie: wykorzystaj odbiorców Google Analytics

Jeśli chcesz w większym stopniu wykorzystać zdarzenie AppAttestEnabled Analytics, możesz utworzyć grupę odbiorców Analytics w celu śledzenia użytkowników przy ustawieniu AppAttestEnabled na wartość true.

App Attest został wydany w systemie iOS 14.0. Niektórzy z Twoich użytkowników mogą nie korzystać z tej wersji i dlatego nie kwalifikują się do testu aplikacji. Możesz zarejestrować inne zdarzenie Analytics, aby śledzić tych użytkowników, a następnie skierować reklamy do tych odbiorców za pomocą innej metody poświadczania, takiej jak DeviceCheck .

Opcjonalnie: użyj Crashlytics do monitorowania awarii

Aby lepiej zrozumieć stabilność aplikacji podczas wdrażania, użyj Firebase Crashlytics do monitorowania awarii i zdarzeń innych niż krytyczne.

6. Gratulacje!

Pomyślnie wdrożyłeś Sprawdzanie aplikacji za pomocą zdalnej konfiguracji 🎉

Dodatkowe zasoby: