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
- Firebase App Check for Apple Platforms codelab'ini tamamlamış olmanız gerekir.
Gerekenler
- Xcode 12.5+
- App Attest testi için:
- Yeni uygulama tanımlayıcıları oluşturmanıza olanak tanıyan bir Apple Developer hesabı
- App Attest özelliği etkinleştirilmiş, açık bir uygulama kimliğine sahip uygulama. Süreçle ilgili yardıma ihtiyacınız olursa Uygulama kimliği kaydetme ve Uygulama özelliklerini etkinleştirme makalelerine bakın.
- App Attest'i destekleyen bir iOS/iPadOS cihaz
- Aşağıdakileri içeren Firebase projesi:
- Yapılandırılmış bir iOS uygulaması (daha fazla bilgi)
- Google Analytics, Remote Config ve App Check etkinleştirilmiş olmalıdır.
- 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.
AppCheckProvider
protokolüne uygunNSObject
alt sınıfı olan "MyAppCheckProvider" adlı bir dosya oluşturun.- 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 :
- 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.
- Parametre adı (anahtar) alanına
AppAttestEnabled
girin. - Veri türü açılır listesinden Boole'u seçin.
- Varsayılan değer açılır listesinden false'u seçin.
Kaydet'i tıklamadan önce kullanıcıların% 10'u için koşullu bir değer oluşturun:
- Yeni ekle > Koşullu değer > Yeni koşul oluştur'u tıklayın.
- Ad alanına bir koşul adı girin.
- Ş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.
- Koşul oluştur'u tıklayın.
App Attest'in kullanıcılarınızın% 10'unda kullanıma 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.
İş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.
İ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 🎉