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
- olan Firebase projesi
- Yapılandırılmış bir iOS uygulaması (daha fazla bilgi)
- Google Analytics, Remote Config ve Uygulama Kontrolü etkin
- 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.
- "MyAppCheckProvider" dosyasını oluşturma bu,
AppCheckProvider
protokolüne uygun olanNSObject
alt sınıfıdır. - 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 :
- 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.
- Parametre adı (anahtar) alanına
AppAttestEnabled
yazın. - Veri türü açılır menüsünden Boole'u seçin.
- Default value (Varsayılan değer) açılır menüsünden false'u (yanlış) seçin.
Kaydet'i tıklamadan önce, kullanıcıların% 10'u için koşullu bir değer oluşturun:
- Yeni ekle'yi tıklayın > Koşullu değer > Yeni koşul oluştur.
- Ad alanına bir koşul adı girin.
- Ş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.
- Koşul oluştur'u tıklayın.
App Attest'in kullanıcılarınızın% 10'una sunulması için koşullu değeri true olarak ayarlayın.
- Yeni oluşturduğunuz koşul için değeri true olarak ayarlayın.
- Kaydet'i tıklayın.
İş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.
İ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 🎉