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

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


С помощью Firebase Remote Config вы можете определять параметры в своем приложении и обновлять их значения в облаке, что позволяет изменять внешний вид и поведение приложения без распространения обновлений. Это руководство шаг за шагом описывает процесс начала работы и содержит примеры кода, которые можно клонировать или загрузить из репозитория firebase/quickstart-ios на GitHub.

Шаг 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. На вкладке «Параметры» откройте меню и выберите «Загрузить значения по умолчанию» .

    2. При появлении запроса включите поддержку файлов .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 откройте свой проект.
  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)")
            }
      }

    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 минут (в более новых версиях лимиты более гибкие).

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

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

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