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

1. Giriş

Arka uç hizmetlerinizi korumak ve Firebase hizmetlerine gönderilen 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 genellikle kullanıcıların App Attest hizmetini kademeli olarak kullanmaya başlaması önerilir. Daha fazla bilgi için Apple'ın "Preparing to Use the App Attest Service" (Uygulama Onay Hizmetini Kullanmaya Hazırlanma) başlıklı makaleye göz atın. belgelerinden faydalanabilirsiniz.

"Aşamalı olarak sürüm güncellemesi yayınlama" bölümünde açıklandığı gibi, Apple'ın App Store Connect özelliğini kullanarak uygulama güncellemelerini kademeli olarak yayınlama olanağı, daha sorunsuz bir şekilde kullanıma sunulmasını sağlayabilir. Bu, basit ve basit bir çözümdür. Ancak bir uygulama sürümü güncellemesini aşamalı olarak yayınlamak, yeni bir uygulama sürümü yayınlamadan mevcut güncellenmiş uygulamaların kullanıma sunulmasını kontrol etmenize veya davranışını değiştirmenize olanak tanımaz.

App Attest'in kullanıma sunulmasıyla, Uygulama Kontrolünüz üzerinde daha fazla kontrol sahibi olmanın bir yolu da Firebase Remote Config'i kullanarak, aynı anda uygulamanızın kullanıcılarının belirli bir yüzdesi için App Attest ile Uygulama Kontrolü'nü etkinleştirmektir. Bu işlem, onay sunucularından gelen kısıtlamayı önlemeye yardımcı olabilir. Kullanıma sunmanın kullanıcılar üzerindeki etkisini gözlemlemek için Google Analytics kullanılabilir.

Neler öğreneceksiniz?

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

Bu codelab'de, Apple Platformları için Firebase Uygulama Kontrolü codelab'inde açıklandığı gibi, DatabaseExample hızlı başlangıç uygulamasına dayalı olan ve Firebase Uygulama Kontrolü ile entegre edilmiş bir Firebase projesi kullanılır. DatabaseExample hızlı başlangıç uygulaması, kullanıcıların Firebase Realtime Database özelliklerini kullanarak giriş yapıp gönderi eklemesine olanak tanır.

Dilerseniz bu codelab'deki adımları kendi uygulamanızı test etmek için de uyarlayabilirsiniz.

Ön koşullar

Gerekenler

  • Xcode 12.5 ve sonraki sürümler
  • Uygulama Onayı testi için:
    • Yeni uygulama tanımlayıcıları oluşturmanıza olanak tanıyan bir Apple Geliştirici hesabı
    • App Attest (Uygulama Onayı) özelliğinin etkinleştirildiği açık bir uygulama kimliğine sahip bir uygulama. İşlemle ilgili yardıma ihtiyaç duyarsanız Uygulama Kimliği Kaydetme ve Uygulama özelliklerini etkinleştirme makalelerine göz atın.
    • App Attest'i destekleyen bir iOS/iPadOS cihaz
  • Uygulamanızın ilişkili Firebase projesine (Remote Config oluşturma, yönetme ve Google Analytics'i görüntüleme izinlerine sahip) erişim

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

Bu adımda, yalnızca App Attest etkinleştirildiğinde jeton sağlamak için ö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 işlevi görür.

Aşağıdaki adımları tamamlamak için Xcode'da uygulamanızın Çerçeveler, Kitaplıklar ve Yerleşik İçerik bölümüne Firebase, FirebaseRemoteConfig ve FirebaseAnalytics eklemeniz gerekir. Bunun nasıl yapılacağını gösteren örnek için Apple platformları için Firebase Uygulama kontrolü codelab'ine bakın.

  1. "MyAppCheckProvider" dosyasını oluşturma bu, AppCheckProvider protokolüne uygun olan NSObject alt sınıfıdır.
  2. Daha sonra dolduracağınız boş bir getToken() yöntemi ekleyin.

Boş getToken() yönteminin kullanıldığı ö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 örneğini örneklendirmek için karşılık gelen FirebaseApp öğesinin bir örneğini iletmeniz gerekir. Bunun için depolanmış bir mülk oluşturun ve bunu 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 getToken() yönteminizde jeton isteğini App Attest sağlayıcısına yönlendirmek için her şeye sahipsiniz.

Not: getToken() yöntemi hakkında daha fazla bilgiye FirebaseAppCheck Çerçevesi Referansı bölümünden ulaşabilirsiniz.

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 boole parametresini kontrol etmektedir (bu Remote Config parametresi codelab'de daha sonra oluşturulacaktır). Değer false ise kod başarısız olur ve Uygulama Kontrolü'nün mevcut cihazda kullanıma sunulmadığını gösterir. Değer true ise kod, App Attest sağlayıcısı almaya çalışır ve alamazsa başarısız olur. Bu hata kontrolleri geçilirse kod, jeton isteğini App Attest sağlayıcısına yönlendirir.

Analytics etkinlikleri ekleme

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

İki Analytics etkinliği kaydedin: Başarıda AppAttestSuccess, başarısızlıkta ise AppAttestFailure. Bu iki Analytics etkinliği, Uygulama Kontrolü'nü kullanıma sunma sürecinizin başarısını izlemenize ve daha büyük bir kullanıma sunmanın devam edip etmemesi gerektiğine 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. Provider Factory sınıfını güncelleme

Jeton isteğini App Attest sağlayıcısına yönlendirmek için gerekli mantığı uyguladıktan ve 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 Uygulama Kontrolü hata ayıklama sağlayıcısını hedefleyecek, aksi takdirde özel sağlayıcınızı hedefleyecek.

Apple platformları için Firebase Uygulama Kontrolü codelab'inde oluşturduğunuz MyAppCheckProviderFactory sınıfında şu 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 ayarlarını yapılandırmadan önce AppCheckProviderFactory ayarları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 konsoluna Remote Config parametresi ekleyin

Şimdi Firebase konsoluna AppAttestEnabled Remote Config parametresini ekleyin . getToken yönteminiz için bu parametre gerekli.

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 Create configuration'ı (Yapılandırma oluştur) tıklayın.
  2. Parametre adı (anahtar) alanına AppAttestEnabled yazın.
  3. Veri türü açılır menüsünden Boole'u seçin.
  4. Default value (Varsayılan değer) açılır menüsünden false'u (yanlış) 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'yi tıklayın > Koşullu değer > Yeni koşul oluştur.
  2. Ad alanına bir koşul adı girin.
  3. Şu durumda uygulanır... bölümünün altında Rastgele yüzdelik dilimdeki kullanıcı'yı ve <= öğesini seçin, ardından % 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'una 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

İşiniz bittiğinde Remote Config değişikliklerini yayınlayın.

Kullanıma sunmayı cihazınızda test edin

Uygulama kodunu değiştirmeden cihazınızdaki farklı Remote Config işaret değerlerini test etmek için A/B Testi ile Firebase Remote Config Denemeleri oluşturma başlıklı makaleyi inceleyerek AppAttestEnabled parametresinde bir deneme yapılandırın. "Denemenizi test cihazında doğrulama" eğitim bölümü , test cihazınız için nasıl farklı değerler atayacağınızı açıklar.

Son adım, Uygulama Onayı'nı kullanıma sunma sürecinizin başarısını izlemek için Google Analytics'i kullanmaktır.

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

Kullanıma sunma sürecinizin başarısını Analytics Etkinlik 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ı görmek için Crashlytics kontrol panelini izleyebilirsiniz. Uygulamanıza Crashlytics'i ekleme hakkında daha fazla bilgi için Firebase Crashlytics'i kullanmaya başlama bölümüne bakın.

Çoğunlukla AppAttestSuccess etkinlikleri ve az sayıda AppAttestFailure etkinliği görüyorsanız bu, AppAttestEnabled Remote Config parametresindeki koşulu değiştirerek App Attest'in etkinleştirildiği kullanıcı yüzdesini artırabileceğinizi gösterir.

Firebase konsolunda Analytics etkinliklerini inceleme

İsteğe bağlı: Google Analytics kitlesinden yararlanın

AppAttestEnabled Analytics etkinliğinden daha fazla yararlanmak istiyorsanız AppAttestEnabled'ın true (doğru) değerine ayarlanmasıyla kullanıcıları izlemek için bir Analytics Kitlesi oluşturabilirsiniz.

App Attest, iOS 14.0 ile kullanıma sunuldu. Bazı kullanıcılarınız bu sürümde bulunmayabilir ve bu nedenle App Attest için uygun olmayabilir. Bu kullanıcıları izlemek için başka bir Analytics etkinliği kaydedebilir ve ardından söz konusu kitleyi DeviceCheck gibi başka bir onay yöntemi için hedefleyebilirsiniz.

İsteğe bağlı: Kilitlenmeleri izlemek için Crashlytics'i kullanın

Kullanıma sunma sırasında uygulamanızın kararlılığını daha iyi anlamak için Firebase Crashlytics'i kullanarak kilitlenmeleri ve önemli olmayan verileri izleyin.

6. Tebrikler!

Remote Config ile Uygulama Kontrolü'nü başarıyla kullanıma sundunuz 🎉

Ek kaynaklar: