Начните работу с Remote Config на iOS

Выберите платформу: iOS+ Android Web Flutter Unity C++


You can use Firebase Remote Config to define parameters in your app and update their values in the cloud, allowing you to modify the appearance and behavior of your app without distributing an app update. This guide walks you through the steps to get started and provides some sample code, all of which is available to clone or download from the firebase/quickstart-ios GitHub repository.

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

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

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

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

    Быстрый

    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;

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

    Для генерации токена Bearer выполните следующую команду с помощью Google Cloud CLI или Cloud Shell :

    gcloud auth print-access-token
    

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

    Консоль Firebase

    1. В консоли Firebase перейдите на страницу DevOps & Engagement > Remote Config > Parameters .

    2. Откройте В меню выберите пункт «Загрузить значения по умолчанию» .

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

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

    Быстрый

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

    Objective-C

    [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 для типобезопасной конфигурации.

Для более сложных конфигураций можно использовать протокол 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 обертки свойств используются для управления состоянием, привязками и другими свойствами. Для получения дополнительной информации см. Руководство по языку 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()
    }
  }
}

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

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

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

  1. В консоли Firebase перейдите на страницу DevOps & Engagement > Remote Config > Parameters .

  2. Определите параметры с теми же именами, что и параметры, определенные в вашем приложении. Для каждого параметра вы можете установить значение по умолчанию (которое в конечном итоге переопределит значение по умолчанию в приложении), а также задать условные значения. Для получения дополнительной информации см. раздел «Параметры и условия Remote Config .

  3. При использовании пользовательских условий сигнала определите атрибуты и их значения. В следующих примерах показано, как определить пользовательское условие сигнала.

    Быстрый

        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: Получение и активация значений

Для получения значений параметров из Remote Config вызовите метод fetchWithCompletionHandler: или fetchWithExpirationDuration:completionHandler: :. Все значения, установленные на бэкэнде, будут получены и кэшированы в объекте Remote Config .

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

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

Быстрый

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

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

Шаг 6: Следите за обновлениями в режиме реального времени.

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

Поддержка обновлений в реальном времени обеспечивается SDK Firebase для платформ Apple версии 10.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()
          }
        }
      }
      

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

Регулирование скорости

Если приложение выполняет слишком много запросов за короткий промежуток времени, количество запросов ограничивается, и SDK возвращает FIRRemoteConfigFetchStatusThrottled . До версии SDK 6.3.0 лимит составлял 5 запросов за 60 минут (в более новых версиях лимиты более гибкие).

During app development, you might want to fetch more often to refresh the cache very frequently (many times per hour) to let you rapidly iterate as you develop and test your app. Real-time Remote Config updates automatically bypass the cache when the config is updated on the server. To accommodate rapid iteration on a project with numerous developers, you can temporarily add a FIRRemoteConfigSettings property with a low minimum fetch interval ( MinimumFetchInterval ) in your app.

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

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