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
- Ukończono sprawdzanie aplikacji Firebase pod kątem ćwiczeń z programowania dotyczących platform Apple
Co będziesz potrzebował
- Xkod 12.5+
- W przypadku testowania atestu aplikacji:
- Konto programisty Apple, które umożliwia tworzenie nowych identyfikatorów aplikacji
- Aplikacja z jawnym identyfikatorem aplikacji z włączoną funkcją Atest aplikacji. Zobacz artykuły dotyczące rejestracji identyfikatora aplikacji i włączania możliwości aplikacji, jeśli potrzebujesz pomocy w tym procesie.
- Urządzenie z systemem iOS/iPadOS obsługujące aplikację App Attest
- Projekt Firebase z:
- Skonfigurowana aplikacja na iOS ( dowiedz się więcej )
- Włączono Google Analytics , zdalną konfigurację i sprawdzanie aplikacji
- Dostęp do projektu Firebase powiązanego z Twoją aplikacją, z uprawnieniami do tworzenia zdalnej konfiguracji i zarządzania nią oraz do przeglądania Google Analytics
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 .
- Utwórz plik „ MyAppCheckProvider ” będący podklasą
NSObject
zgodną z protokołemAppCheckProvider
. - 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:
- Otwórz Zdalną konfigurację swojego projektu i kliknij Dodaj parametr . Jeśli po raz pierwszy korzystasz ze zdalnej konfiguracji, kliknij opcję Utwórz konfigurację .
- W polu Nazwa parametru (klucz) wprowadź
AppAttestEnabled
. - Z listy rozwijanej Typ danych wybierz opcję Boolean .
- Z listy rozwijanej Wartość domyślna wybierz opcję false .
Przed kliknięciem Zapisz utwórz wartość warunkową dla 10% użytkowników:
- Kliknij opcję Dodaj nowy > Wartość warunkowa > Utwórz nowy warunek .
- W polu Nazwa wprowadź nazwę warunku.
- W sekcji Stosuje się, jeśli... wybierz opcję Użytkownik w losowym percentylu , <= , a następnie wprowadź 10 w polu % .
- Kliknij opcję Utwórz warunek .
Ustaw wartość warunkową na true , aby aplikacja App Attest została wdrożona u 10% użytkowników.
- Ustaw wartość na true dla właśnie utworzonego warunku.
- Kliknij Zapisz .
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 .
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 🎉