iOS'te Remote Config'i kullanmaya başlama

Platform seçin: iOS+ Android Web Flutter Unity C++


Uygulamanızda parametreleri tanımlamak ve buluttaki değerlerini güncellemek için Firebase Remote Config hizmetini kullanabilirsiniz. Böylece uygulama güncellemesi yayınlamadan uygulamanızın görünümünü ve davranışını değiştirebilirsiniz. Bu kılavuzda, başlangıç adımları açıklanmakta ve bazı örnek kodlar verilmektedir. Bu kodların tümü, firebase/quickstart-ios GitHub deposundan klonlanabilir veya indirilebilir.

1. adım: Uygulamanıza Remote Config ekleyin

  1. Henüz yapmadıysanız Firebase'i Apple projenize ekleyin.

  2. Remote Config için, Google Analytics, uygulama örneklerinin kullanıcı özelliklerine ve kitlelere koşullu olarak hedeflenmesi amacıyla gereklidir. Projenizde Google Analytics'ı etkinleştirdiğinizden emin olun.

  3. Aşağıdaki örnekte gösterildiği gibi tekil Remote Config nesnesini oluşturun:

    Swift

    let remoteConfig = RemoteConfig.remoteConfig()
    let settings = RemoteConfigSettings()
    settings.minimumFetchInterval = 0
    RemoteConfig.remoteConfig().configSettings = settings

    Objective-C

    FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
    FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
    remoteConfigSettings.minimumFetchInterval = 0;
    remoteConfig.configSettings = remoteConfigSettings;

Bu nesne, uygulama içi varsayılan parametre değerlerini depolamak, güncellenmiş parametre değerlerini Remote Config arka ucundan almak ve alınan değerlerin uygulamanızda ne zaman kullanılabilir hale getirileceğini kontrol etmek için kullanılır.

Geliştirme sırasında, nispeten düşük bir minimum getirme aralığı ayarlamanız önerilir. Daha fazla bilgi için Kısıtlama bölümüne bakın.

2. adım: Uygulama içi varsayılan parametre değerlerini ayarlama

Uygulama içi varsayılan parametre değerlerini Remote Config nesnesinde ayarlayabilirsiniz. Böylece uygulamanız, Remote Config arka ucuna bağlanmadan önce amaçlandığı gibi davranır ve arka uçta herhangi bir değer ayarlanmamışsa varsayılan değerler kullanılabilir.

  1. NSDictionary nesnesi veya plist dosyası kullanarak bir dizi parametre adı ve varsayılan parametre değeri tanımlayın.

    Remote Config arka uç parametre değerlerini zaten yapılandırdıysanız tüm varsayılan değerleri içeren oluşturulmuş bir plist dosyasını indirip Xcode projenize kaydedebilirsiniz.

    REST

    curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=PLIST -o RemoteConfigDefaults.plist
    

    Google Cloud CLI veya Cloud Shell'i kullanarak aşağıdaki komutu çalıştırarak hamiline ait jeton oluşturabilirsiniz:

    gcloud auth print-access-token
    

    Bu jetonun kullanım süresi kısa olduğundan kimlik doğrulama hatası alırsanız jetonu yeniden oluşturmanız gerekebilir.

    Firebase konsolu

    1. Firebase konsolunda DevOps ve Etkileşim > Remote Config > Parametreler sayfasına gidin.

    2. Menü 'yü açın ve Varsayılan değerleri indir'i seçin.

    3. İstendiğinde iOS için.plist'i etkinleştirin ve Dosyayı indir'i tıklayın.

  2. setDefaults: kullanarak bu değerleri Remote Config nesnesine ekleyin. Aşağıdaki örnekte, bir plist dosyasından uygulama içi varsayılan değerler ayarlanmaktadır:

    Swift

    RemoteConfig.remoteConfig().setDefaults(fromPlist: "RemoteConfigDefaults")

    Objective-C

    [remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

3. adım: Uygulamanızda kullanmak için parametre değerleri alın

Artık Remote Config nesnesinden parametre değerlerini alabilirsiniz. Daha sonra Remote Config arka ucunda değerler ayarlar, bunları getirir ve etkinleştirirseniz bu değerler uygulamanızda kullanılabilir. Aksi takdirde, setDefaults: kullanılarak yapılandırılan uygulama içi parametre değerlerini alırsınız. Bu değerleri almak için parametre anahtarını bağımsız değişken olarak sağlayarak configValueForKey: yöntemini çağırın.

let remoteConfig = RemoteConfig.remoteConfig()

// Retrieve a parameter value using configValueForKey
let welcomeMessageValue = remoteConfig.configValue(forKey: "welcome_message")
let welcomeMessage = welcomeMessageValue.stringValue

let featureFlagValue = remoteConfig.configValue(forKey: "new_feature_flag")
let isFeatureEnabled = featureFlagValue.boolValue

Swift'te bu değerlere erişmenin daha okunaklı ve kullanışlı bir yolu, Swift'in alt simge gösterimini kullanmaktır:

let remoteConfig = RemoteConfig.remoteConfig()

// Retrieve a string parameter value
let welcomeMessage = remoteConfig["welcome_message"].stringValue

// Retrieve a boolean parameter value
let isFeatureEnabled = remoteConfig["new_feature_flag"].boolValue

// Retrieve a number parameter value
let maxItemCount = remoteConfig["max_items"].numberValue.intValue

Tip güvenliği olan yapılandırma için Codable'ı kullanma

Daha karmaşık yapılandırmalar için Swift'in Codable protokolünü kullanarak Remote Config'dan yapılandırılmış verilerin kodunu çözebilirsiniz. Bu sayede, tip güvenliği sağlayan konfigürasyon yönetimi elde edilir ve karmaşık nesnelerle çalışmak kolaylaşır.

// Define a Codable struct for your configuration
struct AppFeatureConfig: Codable {
  let isNewFeatureEnabled: Bool
  let maxUploadSize: Int
  let themeColors: [String: String]
}

// Fetch and decode the configuration
func configureAppFeatures() {
  let remoteConfig = RemoteConfig.remoteConfig()
  remoteConfig.fetchAndActivate { status, error in
    guard error == nil else { return }

    do {
      let featureConfig = try remoteConfig["app_feature_config"].decoded(asType: AppFeatureConfig.self)
      configureApp(with: featureConfig)
    } catch {
      // Handle decoding errors
      print("Failed to decode configuration: \(error)")
    }
  }
}

Bu yöntemle şunları yapabilirsiniz:

  • Karmaşık yapılandırma yapıları tanımlama
  • JSON yapılandırmalarını otomatik olarak ayrıştırın.
  • Remote Config değerlerine erişirken tip güvenliğini sağlayın.
  • Yapılandırılmış Remote Config şablonlarını işlemek için temiz ve okunabilir kod sağlayın.

SwiftUI'da bildirim temelli yapılandırma için özellik sarmalayıcıları kullanma

Özellik sarmalayıcılar, özellik bildirimlerine özel davranışlar eklemenize olanak tanıyan güçlü bir Swift özelliğidir. SwiftUI'da özellik sarmalayıcılar, durum, bağlama ve diğer özellik davranışlarını yönetmek için kullanılır. Daha fazla bilgi için Swift Language Guide'a (Swift Dili Kılavuzu) bakın.

struct ContentView: View {
  @RemoteConfigProperty(key: "cardColor", fallback: "#f05138")
  var cardColor

  var body: some View {
    VStack {
      Text("Dynamic Configuration")
        .background(Color(hex: cardColor))
    }
    .onAppear {
      RemoteConfig.remoteConfig().fetchAndActivate()
    }
  }
}

SwiftUI'da Remote Config değerlerine erişmek için açıklayıcı bir yöntem kullanmak istiyorsanız @RemoteConfigProperty özellik sarmalayıcısını kullanın. Bu sarmalayıcı, varsayılan değerler ve basitleştirilmiş konfigürasyon yönetimi için yerleşik destek sunar.

4. adım: Parametre değerlerini ayarlayın

Firebase konsolunu veya Remote Config arka uç API'lerini kullanarak, istediğiniz koşullu mantığa veya kullanıcı hedeflemeye göre uygulama içi değerleri geçersiz kılan yeni arka uç varsayılan değerleri oluşturabilirsiniz. Bu bölümde, bu değerleri oluşturmak için Firebase konsolunda uygulamanız gereken adımlar açıklanmaktadır.

  1. Firebase konsolunda DevOps ve Etkileşim > Remote Config > Parametreler sayfasına gidin.

  2. Uygulamanızda tanımladığınız parametrelerle aynı adlara sahip parametreler tanımlayın. Her parametre için varsayılan bir değer (sonuçta uygulama içi varsayılan değeri geçersiz kılar) ve koşullu değerler ayarlayabilirsiniz. Daha fazla bilgi edinmek için Remote Config Parametreleri ve Koşulları başlıklı makaleyi inceleyin.

  3. Özel sinyal koşulları kullanıyorsanız özellikleri ve değerlerini tanımlayın. Aşağıdaki örneklerde, özel sinyal koşulunun nasıl tanımlanacağı gösterilmektedir.

    Swift

        Task {
            let customSignals: [String: CustomSignalValue?] = [
            "city": .string("Tokyo"),
            "preferred_event_category": .string("sports")
          ]
    
          do {
            try await remoteConfig.setCustomSignals(customSignals)
            print("Custom signals set successfully!")
            } catch {
                print("Error setting custom signals: \(error)")
            }
      }

    Objective-C

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          NSDictionary *customSignals = @{
            @"city": @"Tokyo",
            @"preferred_event_category": @"sports"
          };
    
          [self.remoteConfig setCustomSignals:customSignals withCompletion:^(NSError * _Nullable error) {
              if (error) {
                  NSLog(@"Error setting custom signals: %@", error);
              } else {
                  NSLog(@"Custom signals set successfully!");
              }
        }];
    });

5. adım: Değerleri getirin ve etkinleştirin

Remote Config parametre değerlerini getirmek için fetchWithCompletionHandler: veya fetchWithExpirationDuration:completionHandler: yöntemini çağırın. Arka uçta ayarladığınız tüm değerler getirilir ve Remote Config nesnesinde önbelleğe alınır.

Değerleri tek bir çağrıda getirip etkinleştirmek istediğiniz durumlarda fetchAndActivateWithCompletionHandler: kullanın.

Bu örnek, Remote Config arka ucundan değerleri (önbelleğe alınmış değerleri değil) getirir ve bunları uygulamada kullanılabilir hale getirmek için activateWithCompletionHandler: yöntemini çağırır:

Swift

remoteConfig.fetch { (status, error) -> Void in
  if status == .success {
    print("Config fetched!")
    remoteConfig.activate { changed, error in
      // ...
    }
  } else {
    print("Config not fetched")
    print("Error: \(error?.localizedDescription ?? "No error available.")")
  }
}

Objective-C

[remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
  if (status == FIRRemoteConfigFetchStatusSuccess) {
    NSLog(@"Config fetched!");
    [remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Activate error: %@", error.localizedDescription);
      } else {
        dispatch_async(dispatch_get_main_queue(), ^{
          // update UI
        });
      }
    }];
  } else {
    NSLog(@"Config not fetched");
    NSLog(@"Error %@", error.localizedDescription);
  }
}];

Bu güncellenmiş parametre değerleri uygulamanızın davranışını ve görünümünü etkilediğinden, getirilen değerleri kullanıcınız için sorunsuz bir deneyim sağlayacak bir zamanda (ör. kullanıcının uygulamanızı bir sonraki açışında) etkinleştirmeniz gerekir. Daha fazla bilgi ve örnek için Remote Config yükleme stratejileri başlıklı makaleyi inceleyin.

6. adım: Güncellemeleri anlık olarak dinleme

Parametre değerlerini aldıktan sonra Remote Config arka ucundan gelen güncellemeleri dinlemek için gerçek zamanlı Remote Config özelliğini kullanabilirsiniz. Gerçek zamanlı Remote Config, güncellemeler kullanıma sunulduğunda bağlı cihazlara sinyal gönderir ve yeni bir Remote Config sürümü yayınladıktan sonra değişiklikleri otomatik olarak getirir.

Anlık güncellemeler, Apple platformları için Firebase SDK'sının 10.7.0 ve sonraki sürümlerinde desteklenir.

  1. Uygulamanızda, güncellemeleri dinlemeye başlamak ve yeni veya güncellenmiş parametre değerlerini otomatik olarak almak için addOnConfigUpdateListener yöntemini çağırın. Aşağıdaki örnekte, güncellemeler dinlenir ve activateWithCompletionHandler çağrıldığında, güncellenmiş bir karşılama mesajı göstermek için yeni getirilen değerler kullanılır.

    Swift

    remoteConfig.addOnConfigUpdateListener { configUpdate, error in
        guard let configUpdate, error == nil else {
          print("Error listening for config updates: \(error)")
        }
    
        print("Updated keys: \(configUpdate.updatedKeys)")
    
        self.remoteConfig.activate { changed, error in
          guard error == nil else { return self.displayError(error) }
          DispatchQueue.main.async {
            self.displayWelcome()
          }
        }
      }
      

    Objective-C

    __weak __typeof__(self) weakSelf = self;
      [self.remoteConfig addOnConfigUpdateListener:^(FIRRemoteConfigUpdate * _Nonnull configUpdate, NSError * _Nullable error) {
        if (error != nil) {
          NSLog(@"Error listening for config updates %@", error.localizedDescription);
        } else {
          NSLog(@"Updated keys: %@", configUpdate.updatedKeys);
    
          __typeof__(self) strongSelf = weakSelf;
          [strongSelf.remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
            if (error != nil) {
              NSLog(@"Activate error %@", error.localizedDescription);
            }
    
            dispatch_async(dispatch_get_main_queue(), ^{
              [strongSelf displayWelcome];
            });
          }];
        }
      }];
      
  2. Remote Config uygulamanızın yeni bir sürümünü yayınladığınızda, uygulamanızı çalıştıran ve değişiklikleri dinleyen cihazlar tamamlama işleyicisini çağırır.

Kısıtlama

Bir uygulama kısa bir süre içinde çok fazla getirme işlemi yaparsa getirme çağrıları kısıtlanır ve SDK, FIRRemoteConfigFetchStatusThrottled değerini döndürür. SDK'nın 6.3.0 sürümünden önce sınır, 60 dakikalık bir zaman aralığında 5 getirme isteğiydi (daha yeni sürümlerde daha esnek sınırlar vardır).

Uygulama geliştirme sırasında, uygulamanızı geliştirip test ederken hızlı bir şekilde yineleme yapabilmek için önbelleği çok sık (saatte birçok kez) yenilemek üzere daha sık getirme işlemi yapmak isteyebilirsiniz. Gerçek zamanlı Remote Config güncellemeleri, yapılandırma sunucuda güncellendiğinde önbelleği otomatik olarak atlar. Çok sayıda geliştiricinin çalıştığı bir projede hızlı iterasyonlar yapmak için uygulamanıza geçici olarak minimum getirme aralığı düşük (MinimumFetchInterval) bir FIRRemoteConfigSettings özelliği ekleyebilirsiniz.

Remote Config için varsayılan ve önerilen üretim getirme aralığı 12 saattir. Bu, gerçekte kaç getirme çağrısı yapıldığına bakılmaksızın yapılandırmaların 12 saatlik bir zaman aralığında arka uçtan birden fazla kez getirilmeyeceği anlamına gelir. Özellikle, minimum getirme aralığı aşağıdaki sırayla belirlenir:

  1. fetch(long) içindeki parametre
  2. FIRRemoteConfigSettings.MinimumFetchInterval içindeki parametre
  3. Varsayılan değer 12 saattir.