Начало работы с Firebase Remote Config


Вы можете использовать Firebase Remote Config для определения параметров в вашем приложении и обновления их значений в облаке, что позволяет вам изменять внешний вид и поведение вашего приложения без распространения обновления приложения. Это руководство проходит через шаги, чтобы начать работу и предоставляет некоторый пример кода, который доступен для клонирования или загрузки с репозитория Firebase/QuickStart-IOIS GitHub.

Шаг 1: Добавьте Remote Config в ваше приложение

  1. Если вы еще этого не сделали, добавьте Firebase в свой Apple Project .

  2. Для Remote Config Google Analytics необходим для условного таргетинга экземпляров приложения на свойства и аудитории пользователей. Убедитесь, что вы включите Google Analytics в свой проект.

  3. Создайте объект Remote Config Singleton, как показано в следующем примере:

    Быстрый

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

    Цель-C

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

Этот объект используется для хранения значений параметров по умолчанию в приложении, получения обновленных значений параметров из серверной части Remote Config и управления тем, когда полученные значения становятся доступными для вашего приложения.

Во время разработки рекомендуется установить относительно низкий минимальный интервал выборки. Смотрите дросселирование для получения дополнительной информации.

Шаг 2: Установите значения параметров по умолчанию в приложении

Вы можете установить значения параметров по умолчанию в приложении в объекте Remote Config , чтобы ваше приложение ведет себя так, как задумано, прежде чем подключиться к Remote Config , и поэтому значения по умолчанию доступны, если их не установлены в бэкэнд.

  1. Определите набор имен параметров и значения параметров по умолчанию, используя объект NSDictionary или файл PLIST .

    Если вы уже настроили значения параметров Remote Config , вы можете загрузить сгенерированный файл plist , который включает все значения по умолчанию и сохранить его в вашем проекте XCode.

    ОТДЫХ

    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

    1. На вкладке «Параметры » откройте меню и выберите «Загрузить значения по умолчанию» .

    2. При запросе, включите .plist для iOS , затем нажмите файл загрузки .

  2. Добавьте эти значения в объект Remote Config используя setDefaults: . В следующем примере устанавливает значения по умолчанию в приложении из файла PLIST:

    Быстрый

    remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")

    Цель-C

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

Шаг 3: Получите значения параметров для использования в вашем приложении

Теперь вы можете получить значения параметров из объекта Remote Config . Если вы позже установите значения в бэкэнд Remote Config , принесите их, а затем активируйте их, эти значения доступны для вашего приложения. В противном случае вы получаете значения параметров в приложении, настроенные с использованием setDefaults: . Чтобы получить эти значения, вызовите configValueForKey: метод, предоставляя ключ параметра в качестве аргумента.

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 - это подписка 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

Используйте Codable for Type-Safe Configuration

Для более сложных конфигураций вы можете использовать Codable протокол Swift для декодирования структурированных данных из Remote Config . Это обеспечивает управление конфигурацией типа и упрощает работу со сложными объектами.

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

Этот метод позволяет вам:

  • Определите сложные структуры конфигурации.
  • Автоматически анализируйте конфигурации JSON.
  • Обеспечить безопасность типа при доступе к Remote Config .
  • Предоставьте чистый, читаемый код для обработки структурированных шаблонов Remote Config .

Используйте обертки свойств для декларативной конфигурации в Swiftui

Обертки свойств - это мощная функция Swift, которая позволяет добавлять пользовательское поведение в объявления свойства. В Swiftui обертки недвижимости используются для управления состоянием, привязками и другим поведением в области недвижимости. Для получения дополнительной информации см. Руководство по быстрому языку .

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

Используйте оболочку свойства @RemoteConfigProperty , если вы хотите декларативный способ получить доступ к Remote Config в Swiftui, со встроенной поддержкой значений по умолчанию и упрощенным управлением конфигурацией.

Шаг 4: Установите значения параметров

Используя консоль Firebase или API-интерфейсы Remote Config , вы можете создать новые значения бэкэнд по умолчанию, которые переопределяют значения в приложении в соответствии с вашей желаемой условной логикой или таргетингом пользователя. Этот раздел проходит через шаги консоли Firebase для создания этих значений.

  1. В консоли Firebase откройте свой проект.
  2. Выберите Remote Config в меню, чтобы просмотреть Remote Config .
  3. Определите параметры с теми же именами, что и параметры, которые вы определили в вашем приложении. Для каждого параметра вы можете установить значение по умолчанию (которое в конечном итоге будет переопределить значение по умолчанию в приложении), и вы также можете установить условные значения. Чтобы узнать больше, см. Remote Config .
  4. При использовании пользовательских условий сигнала определите атрибуты и их значения. Следующие примеры показывают, как определить пользовательское условие сигнала.

    Быстрый

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

    Цель-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: Принесите и активируйте значения

Чтобы получить значения параметров из Remote Config , вызовите fetchWithCompletionHandler: или fetchWithExpirationDuration:completionHandler: Метод. Любые значения, которые вы устанавливаете на бэкэнде, извлекаются и кэшируются в объекте Remote Config .

Для тех случаев, когда вы хотите получить и активировать значения за один вызов, используйте fetchAndActivateWithCompletionHandler: .

Этот пример извлекает значения из Remote Config (не кэшированных значений) и вызовов activateWithCompletionHandler: чтобы сделать их доступными для приложения:

Быстрый

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

Цель-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);
    }
}];

Поскольку эти обновленные значения параметров влияют на поведение и внешний вид вашего приложения, вы должны активировать извлекаемые значения за раз, которые обеспечивают плавный опыт для вашего пользователя, например, в следующий раз, когда пользователь открывает ваше приложение. См. Удаленную стратегии загрузки конфигурации для получения дополнительной информации и примеров.

Шаг 6: Слушайте обновления в режиме реального времени

После того, как вы получите значения параметров, вы можете использовать Remote Config в реальном времени для прослушивания обновлений из Remote Config . Remote Config в реальном времени на подключенные устройства, когда доступны обновления, и автоматически получает изменения после публикации новой версии Remote Config .

Обновления в реальном времени поддерживаются Firebase SDK для Apple Platforms V10.7.0+ и выше.

  1. В вашем приложении вызовите addOnConfigUpdateListener чтобы начать прослушивание обновлений и автоматически приносить любые новые или обновленные значения параметров. В следующем примере прослушивается обновления, и при вызове activateWithCompletionHandler используется вновь извлеченные значения для отображения обновленного приветственного сообщения.

    Быстрый

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

    Цель-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 , устройств, которые запускают ваше приложение и прислушиваются к изменениям, вызовут обработчик завершения.

Дросселя

Если приложение приносит слишком много раз за короткий период, вызовы Feetch задушен, а SDK возвращает FIRRemoteConfigFetchStatusThrottled . Перед версией SDK 6.3.0 лимит был 5 запросов избрать в 60 -минутном окне (более новые версии имеют больше разрешающих пределов).

Во время разработки приложений вы, возможно, захотите получать чаще, чтобы очень часто обновлять кэш (много раз в час), чтобы вы быстро обращались при разработке и тестировании своего приложения. Обновления удаленного конфигурации в реальном времени автоматически обходят кэш, когда конфигурация обновляется на сервере. Чтобы приспособиться к быстрой итерации в проекте с многочисленными разработчиками, вы можете временно добавить свойство FIRRemoteConfigSettings с низким минимальным интервалом извлечения ( MinimumFetchInterval ) в вашем приложении.

По умолчанию и рекомендованному интервалу производства для Remote Config составляют 12 часов, что означает, что конфигурации не будут извлечены из бэкэнд более одного раза в 12 -часовом окне, независимо от того, сколько вызовов фактически сделано. В частности, минимальный интервал выборки определяется в следующем порядке:

  1. Параметр в fetch(long)
  2. Параметр в FIRRemoteConfigSettings.MinimumFetchInterval
  3. Значение по умолчанию 12 часов

Следующие шаги

Если вы еще этого не сделали, изучите варианты использования Remote Config и посмотрите на некоторые из ключевых концепций и документации «Расширенные стратегии», в том числе: