Mulai Menggunakan Firebase Remote Config


Anda dapat menggunakan Firebase Remote Config untuk menetapkan parameter dalam aplikasi dan memperbarui value-nya di cloud, sehingga Anda dapat memodifikasi tampilan dan perilaku aplikasi tanpa mendistribusikan update aplikasi. Panduan ini akan menuntun Anda menjalankan langkah-langkah untuk memulai, serta menyediakan kode contoh yang semuanya dapat di-clone atau didownload dari repositori GitHub firebase/quickstart-ios.

Langkah 1: Menambahkan Remote Config ke aplikasi Anda

  1. Jika belum, tambahkan Firebase ke project Apple Anda.

  2. Untuk Remote Config, Google Analytics diperlukan untuk penargetan kondisional instance aplikasi ke properti pengguna dan audience. Pastikan Anda mengaktifkan Google Analytics di project Anda.

  3. Buat objek Remote Config singleton, seperti yang ditunjukkan pada contoh berikut:

    Swift

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

    Objective-C

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

Objek ini digunakan untuk menyimpan parameter value default dalam aplikasi, mengambil parameter value terbaru dari backend Remote Config, dan mengontrol kapan value yang diambil akan tersedia untuk aplikasi Anda.

Selama pengembangan, sebaiknya tetapkan interval pengambilan minimum yang relatif rendah. Baca artikel mengenai Throttling untuk mengetahui informasi selengkapnya.

Langkah 2: Menetapkan parameter value default dalam aplikasi

Anda bisa menetapkan parameter value default dalam aplikasi di objek Remote Config agar aplikasi Anda berperilaku seperti yang diharapkan sebelum terhubung ke backend Remote Config, dan agar ada value default yang tersedia jika tidak ada value yang ditetapkan pada backend.

  1. Tentukan sekumpulan nama parameter dan parameter value default menggunakan objek NSDictionary atau file plist.

    Jika sudah mengonfigurasi parameter value backend Remote Config, Anda dapat mendownload file plist yang dihasilkan yang berisi semua value default dan menyimpannya ke project Xcode.

    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
    

    Firebase console

    1. Di tab Parameters, buka Menu, lalu pilih Download default values.

    2. Jika diminta, aktifkan .plist for iOS, lalu klik Download file.

  2. Tambahkan value ini ke objek Remote Config menggunakan setDefaults:. Contoh berikut menetapkan value default dalam aplikasi dari file plist:

    Swift

    remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")

    Objective-C

    [self.remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

Langkah 3: Mendapatkan parameter value yang akan digunakan dalam aplikasi

Sekarang Anda bisa mendapatkan parameter value dari objek Remote Config. Jika nantinya Anda menetapkan value pada backend Remote Config, mengambilnya, lalu mengaktifkannya, value tersebut akan tersedia untuk aplikasi Anda. Jika tidak, Anda akan mendapatkan parameter value dalam aplikasi yang terkonfigurasi menggunakan setDefaults:. Untuk mendapatkan value ini, panggil metode configValueForKey: dan sediakan kunci parameter sebagai argumen.

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

Cara yang lebih mudah dibaca dan nyaman untuk mengakses nilai ini di Swift adalah melalui notasi subskrip Swift:

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

Menggunakan Codable untuk konfigurasi keamanan jenis

Untuk konfigurasi yang lebih kompleks, Anda dapat menggunakan protokol Codable Swift untuk mendekode data terstruktur dari Remote Config. Hal ini menyediakan pengelolaan konfigurasi keamanan jenis dan menyederhanakan penggunaan objek yang kompleks.

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

Metode ini memungkinkan Anda:

  • Menentukan struktur konfigurasi yang kompleks.
  • Mengurai konfigurasi JSON secara otomatis.
  • Memastikan keamanan jenis saat mengakses nilai Remote Config.
  • Memberikan kode yang jelas dan mudah dibaca untuk menangani template Remote Config terstruktur.

Menggunakan Wrapper Properti untuk konfigurasi deklaratif di SwiftUI

Wrapper properti adalah fitur Swift yang canggih yang memungkinkan Anda menambahkan perilaku kustom ke deklarasi properti. Di SwiftUI, wrapper properti digunakan untuk mengelola status, binding, dan perilaku properti lainnya. Untuk informasi selengkapnya, lihat Panduan Bahasa Swift.

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

Gunakan wrapper properti @RemoteConfigProperty jika Anda menginginkan cara deklaratif untuk mengakses nilai Remote Config di SwiftUI, dengan dukungan bawaan untuk nilai default dan manajemen konfigurasi yang disederhanakan.

Langkah 4: Menetapkan parameter value

Dengan menggunakan konsol Firebase atau API backend Remote Config, Anda dapat membuat value default backend baru yang menggantikan value dalam aplikasi sesuai dengan penargetan pengguna atau logika kondisional yang diinginkan. Bagian ini akan menuntun Anda menjalankan langkah-langkah di Firebase console untuk membuat value tersebut.

  1. Di Firebase console, buka project Anda.
  2. Pilih Remote Config dari menu untuk melihat dasbor Remote Config.
  3. Tetapkan parameter dengan nama yang sama dengan parameter yang Anda tetapkan dalam aplikasi. Untuk setiap parameter, Anda dapat menetapkan value default (yang akan menggantikan value default dalam aplikasi) dan menetapkan value kondisional. Untuk mempelajari lebih lanjut, lihat Parameter dan Kondisi Remote Config.
  4. Jika menggunakan kondisi sinyal kustom, tentukan atribut dan nilainya. Contoh berikut menunjukkan cara menentukan kondisi sinyal kustom.

    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!");
            }
      }];
    });

Langkah 5: Mengambil dan mengaktifkan nilai

Untuk mengambil parameter value dari Remote Config, panggil metode fetchWithCompletionHandler: atau fetchWithExpirationDuration:completionHandler:. Setiap value yang Anda tetapkan pada backend akan diambil dan di-cache di objek Remote Config.

Jika Anda ingin mengambil dan mengaktifkan value dalam satu panggilan, gunakan fetchAndActivateWithCompletionHandler:.

Contoh ini mengambil value dari backend Remote Config (bukan value yang disimpan dalam cache) dan memanggil activateWithCompletionHandler: agar tersedia di aplikasi:

Swift

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

Objective-C

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

Karena parameter value terbaru ini memengaruhi perilaku dan tampilan aplikasi, Anda harus mengaktifkan nilai yang diambil pada saat yang tepat untuk memastikan pengalaman yang lancar bagi pengguna, misalnya saat pengguna membuka aplikasi di waktu berikutnya. Lihat Strategi pemuatan Remote Config untuk mengetahui informasi dan contoh selengkapnya.

Langkah 6: Memproses update secara real time

Setelah mengambil parameter value, Anda dapat menggunakan Remote Config real-time untuk memproses update dari backend Remote Config. Sinyal Remote Config real-time ke perangkat terhubung saat update tersedia dan secara otomatis mengambil perubahan setelah Anda memublikasikan versi Remote Config baru.

Update real-time didukung oleh Firebase SDK untuk platform Apple v10.7.0+ dan yang lebih baru.

  1. Di aplikasi Anda, panggil addOnConfigUpdateListener untuk mulai memproses update dan otomatis mengambil parameter value baru atau yang diperbarui. Contoh berikut memproses update dan saat activateWithCompletionHandler dipanggil, menggunakan nilai yang baru diambil untuk menampilkan pesan selamat datang yang diperbarui.

    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. Jika kemudian Anda memublikasikan versi baru Remote Config, perangkat yang menjalankan aplikasi dan memproses perubahan akan memanggil pengendali penyelesaian.

Throttling

Jika aplikasi terlalu sering melakukan pengambilan dalam jangka waktu yang singkat, panggilan pengambilan akan dibatasi dan SDK akan menampilkan FIRRemoteConfigFetchStatusThrottled. Sebelum SDK versi 6.3.0, batasnya adalah 5 permintaan pengambilan dalam jangka waktu 60 menit (versi yang lebih baru memiliki batas yang lebih fleksibel).

Selama pengembangan aplikasi, sebaiknya lebih sering melakukan pengambilan untuk refresh cache sesering mungkin (berkali-kali per jam) agar Anda dapat melakukan iterasi dengan cepat ketika mengembangkan dan menguji aplikasi. Update Remote Config real-time secara otomatis mengabaikan cache ketika konfigurasi diperbarui di server. Untuk mengakomodasi iterasi yang cepat pada project yang beranggotakan banyak developer, Anda dapat menambahkan properti FIRRemoteConfigSettings dengan interval pengambilan minimum yang rendah (MinimumFetchInterval) ke dalam aplikasi Anda untuk sementara.

Interval pengambilan produksi default dan yang disarankan untuk Remote Config adalah 12 jam. Artinya, konfigurasi tidak akan diambil dari backend lebih dari sekali dalam jangka waktu 12 jam, terlepas dari berapa banyak panggilan pengambilan yang sebenarnya dilakukan. Secara khusus, interval pengambilan minimum ditentukan dengan urutan sebagai berikut:

  1. Parameter di fetch(long)
  2. Parameter di FIRRemoteConfigSettings.MinimumFetchInterval
  3. Nilai default 12 jam

Langkah berikutnya

Pelajari kasus penggunaan Remote Config jika Anda belum melakukannya, dan lihat beberapa dokumentasi strategi lanjutan dan konsep utama, termasuk: