Firebase Remote Config'i kullanarak Firebase Uygulama Kontrolü'nü kademeli olarak kullanıma sunma

1. Giriş

Arka uç hizmetlerinizi korumak ve Firebase hizmetlerine yapılan isteklerin gerçek uygulamanızdan geldiğini doğrulamak için App Attest ile Firebase Uygulama Kontrolü'nü kullanabilirsiniz.

Kota sınırlarına ulaşmamak için kullanıcıları App Attest hizmetine kademeli olarak dahil etmeniz genellikle önerilir. Daha fazla bilgi için Apple'ın "Preparing to Use the App Attest Service" (Uygulama Onaylama Hizmeti'ni Kullanmaya Hazırlanma) başlıklı dokümanına bakın.

"Sürüm güncellemesini aşamalı olarak yayınlama " başlıklı makalede açıklandığı gibi, Apple'ın App Store Connect özelliğini kullanarak uygulama güncellemelerini kademeli olarak yayınlama özelliği, uygulama kontrolünün kullanıma sunulmasını kolaylaştırabilir. Bu, basit ve kolay bir çözümdür. Ancak uygulama sürümü güncellemelerini aşamalı olarak yayınlamak, yeni bir uygulama sürümü yayınlamadan mevcut, güncellenmiş uygulamaların sunumunu kontrol etmenize veya davranışını değiştirmenize olanak tanımaz.

App Attest ile Uygulama Kontrolü'nü kullanıma sunma sürecinde daha fazla kontrol sahibi olmanın bir yolu, Firebase Remote Config'i kullanarak App Attest ile Uygulama Kontrolü'nü uygulamanızın kullanıcılarının belirli bir yüzdesi için etkinleştirmektir. Bu, onay sunucularının sıklık sınırlaması uygulamasını önlemeye yardımcı olabilir. Google Analytics, kullanıma sunma işleminin kullanıcılar üzerindeki etkisini gözlemlemek için kullanılabilir.

Neler öğreneceksiniz?

Bu çok adımlı codelab'de, uygulamanızda App Check'i kullanıma sunmak için Firebase Remote Config'i nasıl kullanacağınızı öğreneceksiniz.

Bu codelab'de, Firebase App Check for Apple Platforms codelab'de açıklandığı gibi DatabaseExample hızlı başlangıç uygulamasına dayalı ve Firebase App Check ile entegre edilmiş bir Firebase projesi kullanılmaktadır. DatabaseExample hızlı başlangıç uygulaması, kullanıcıların Firebase Realtime Database'in özelliklerini kullanarak oturum açmasına ve gönderi eklemesine olanak tanır.

Bu codelab'deki adımları kendi uygulamanızı test etmek için de kullanabilirsiniz.

Ön koşullar

Gerekenler

  • Xcode 12.5+
  • App Attest testi için:
  • Aşağıdakileri içeren Firebase projesi:
  • Uygulamanızın ilişkili Firebase projesine erişim (Remote Config oluşturma ve yönetme, Google Analytics'i görüntüleme izinleriyle birlikte)

2. Özel onay sağlayıcı oluşturma

Bu adımda, yalnızca App Attest etkinleştirildiğinde jeton sağlayan özel bir sağlayıcı sınıfı oluşturacağız. Remote Config, yapılandırılmış bir Firebase uygulama örneğine dayanır ve bu adımda uyguladığınız özel sağlayıcı, yapılandırmayı tamamlamak için yer tutucu görevi görür.

Aşağıdaki adımları tamamlamak için Xcode'da uygulamanızın Frameworks, Libraries, and Embedded Content (Çerçeveler, Kitaplıklar ve Yerleştirilmiş İçerik) bölümüne Firebase, FirebaseRemoteConfig ve FirebaseAnalytics öğelerini eklemeniz gerekir. Bunu nasıl yapacağınızla ilgili bir örnek için Apple platformları için Firebase Uygulama Kontrolü codelab'ine bakın.

  1. AppCheckProvider protokolüne uygun NSObject alt sınıfı olan "MyAppCheckProvider" adlı bir dosya oluşturun.
  2. Daha sonra dolduracağınız boş bir getToken() yöntemi ekleyin.

Boş getToken() yöntemine sahip özel sağlayıcı sınıfı için aşağıdaki örnek koda bakın.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

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

AppAttestProvider öğesini oluşturmak için ilgili FirebaseApp öğesinin bir örneğini iletmeniz gerekir. Bunun için depolanmış bir özellik oluşturun ve başlatıcı parametresi olarak kabul edin:

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

Jeton isteğini App Attest sağlayıcısına yönlendirin.

Artık jeton isteğini getToken() yönteminizde App Attest sağlayıcısına iletmek için gereken her şeye sahipsiniz.

Not: getToken() yöntemi hakkında daha fazla bilgiyi FirebaseAppCheck Framework Reference'ta bulabilirsiniz.

getToken() yönteminize aşağıdaki kodu ekleyin:

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

Önceki kod, bir Remote Config AppAttestEnabled boolean parametresini kontrol eder (bu Remote Config parametresi, codelab'in ilerleyen bölümlerinde oluşturulacaktır). Değer false ise kod başarısız olur ve App Check'in mevcut cihazda kullanıma sunulmadığı belirtilir. Değer doğruysa kod, App Attest sağlayıcısı almaya çalışır ve alamazsa başarısız olur. Bu hata kontrolleri başarılı olursa kod, jeton isteğini App Attest sağlayıcısına yönlendirir.

Analytics etkinlikleri ekleme

Analytics etkinlikleri ekleyerek Uygulama Kontrolü'nün kullanıma sunulmasının ne kadar başarılı olduğu hakkında daha iyi analizler elde edebilirsiniz. Analytics, App Attest'in daha geniş bir kitle için etkinleştirilip etkinleştirilmeyeceğini belirlemeye yardımcı olur.

Başarı durumunda AppAttestSuccess, başarısızlık durumunda ise AppAttestFailure olmak üzere iki Analytics etkinliği günlüğe kaydedin. Bu iki Analytics etkinliği, uygulama kontrolü dağıtımınızın başarısını izlemenize ve daha büyük bir dağıtımın yapılıp yapılmayacağına karar vermenize yardımcı olabilir.

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. Sağlayıcı Fabrikası sınıfını güncelleme

Jeton isteğini App Attest sağlayıcısına yönlendirme mantığını uygulayıp bazı Analytics etkinlikleri ekledikten sonra Apple Platformları için Uygulama Kontrolü codelab'inde oluşturduğunuz MyAppCheckProviderFactory.class öğesini güncellemeniz gerekir. Bu sınıf, simülatörler için App Check hata ayıklama sağlayıcısını, diğer durumlarda ise özel sağlayıcınızı hedefler.

Firebase App Check for Apple platforms codelab'de oluşturduğunuz MyAppCheckProviderFactory sınıfındaki aşağıdaki kodu düzenleyin:

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

FirebaseApp yapılandırmadan önce AppCheckProviderFactory ayarını yaptığınızı onaylayın:

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

4. Firebase konsolunda Remote Config parametresi ekleme

Şimdi Firebase konsoluna Remote Config parametresi AppAttestEnabled'ı ekleyeceksiniz . getToken yönteminiz bu parametreyi gerektiriyor.

Firebase konsolunda Remote Config parametresi oluşturmak için :

  1. Projeniz için Remote Config'i açın ve Parametre ekle'yi tıklayın. Remote Config'i ilk kez kullanıyorsanız Yapılandırma oluştur'u tıklayın.
  2. Parametre adı (anahtar) alanına AppAttestEnabled girin.
  3. Veri türü açılır listesinden Boole'u seçin.
  4. Varsayılan değer açılır listesinden false'u seçin.

Firebase konsolunda Remote Config parametresi oluşturma

Kaydet'i tıklamadan önce kullanıcıların% 10'u için koşullu bir değer oluşturun:

  1. Yeni ekle > Koşullu değer > Yeni koşul oluştur'u tıklayın.
  2. Ad alanına bir koşul adı girin.
  3. Şu durumlarda geçerlidir... bölümünde Rastgele yüzdelik dilimdeki kullanıcı, <= seçeneğini belirleyin ve % alanına 10 değerini girin.
  4. Koşul oluştur'u tıklayın.

Firebase konsolunda Remote Config koşulu tanımlama

App Attest'in kullanıcılarınızın% 10'unda kullanıma sunulması için koşullu değeri true olarak ayarlayın.

  1. Yeni oluşturduğunuz koşul için değeri true olarak ayarlayın.
  2. Kaydet'i tıklayın.

Firebase konsolunda Remote Config parametresini inceleme

İşlemi tamamladığınızda Remote Config değişikliklerini yayınlayın.

Yayınlamayı cihazınızda test etme

Uygulama kodunu değiştirmeden cihazınızda farklı Remote Config işareti değerlerini test etmek için A/B Testi ile Firebase Remote Config Denemeleri Oluşturma eğitimindeki adımları uygulayarak AppAttestEnabled parametresinde bir deneme yapılandırın. Eğitim bölümündeki "Denemenizi bir test cihazında doğrulama" başlıklı makalede, test cihazınıza nasıl farklı değerler atayacağınız açıklanmaktadır.

Son adım, App Attest'in kullanıma sunulmasının başarısını izlemek için Google Analytics'i kullanmaktır.

5. AppCheck'i kullanıma sunma işleminizin başarısını inceleme

Kullanıma sunma işleminizin başarısını Analytics etkinlikleri kontrol panelinde ölçebilirsiniz. AppAttestSuccess ve AppAttestFailure etkinliklerini izleyin. Etkinliklerin kontrol panelinde görünmesi 24 saati bulabilir. Alternatif olarak, hata ayıklamayı etkinleştirebilir ve hata ayıklama etkinliklerini daha hızlı görmek için DebugView'u kullanabilirsiniz.

İsteğe bağlı olarak, kilitlenme oranlarındaki artışlar için Crashlytics kontrol panelini izleyebilirsiniz. Crashlytics'i uygulamanıza ekleme hakkında daha fazla bilgi için Firebase Crashlytics'i kullanmaya başlama başlıklı makaleyi inceleyin.

Çoğunlukla AppAttestSuccess etkinlikleri ve az sayıda AppAttestFailure etkinliği görmeye başladığınızda, Remote Config parametresi AppAttestEnabled'deki koşulu değiştirerek App Attest'in etkin olduğu kullanıcıların yüzdesini artırabilirsiniz.

Firebase konsolunda Analytics etkinliklerini inceleme

İsteğe bağlı: Google Analytics kitlesinden yararlanma

AppAttestEnabled Analytics etkinliğinden daha fazla yararlanmak istiyorsanız AppAttestEnabled değeri doğru olarak ayarlanmış kullanıcıları izlemek için bir Analytics kitlesi oluşturabilirsiniz.

App Attest, iOS 14.0 ile kullanıma sunuldu. Kullanıcılarınızdan bazıları bu sürümü kullanmıyor olabilir ve bu nedenle Uygulama Onaylama'ya uygun olmayabilir. Bu kullanıcıları izlemek için başka bir Analytics etkinliği kaydedebilir, ardından bu kitleyi DeviceCheck gibi başka bir onay yöntemi için hedefleyebilirsiniz.

İsteğe bağlı: Çökmeleri izlemek için Crashlytics'i kullanma

Yayın sırasında uygulamanızın kararlılığını daha iyi anlamak için kilitlenmeleri ve ölümcül olmayan hataları izlemek üzere Firebase Crashlytics'i kullanın.

6. Tebrikler!

Remote Config ile App Check'i başarıyla kullanıma sundunuz 🎉

Ek kaynaklar: