Изменить Remote Config программно

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

Используя REST API Remote Config или Admin SDK , описанные в этом руководстве, вы можете обойтись без управления шаблоном в консоли Firebase и напрямую интегрировать изменения Remote Config в свои собственные процессы. Например, с помощью бэкэнд-API Remote Config вы можете:

  • Планирование обновлений Remote Config . Используя вызовы API в сочетании с заданием cron, вы можете регулярно изменять значения Remote Config по расписанию.
  • Пакетный импорт значений конфигурации позволит эффективно перейти от вашей собственной проприетарной системы к Firebase Remote Config .
  • Используйте Remote Config с Cloud Functions for Firebase , изменяя значения в вашем приложении на основе событий, происходящих на стороне сервера. Например, вы можете использовать Remote Config для продвижения новой функции в вашем приложении, а затем автоматически отключить это продвижение, как только обнаружите, что достаточное количество людей взаимодействовало с новой функцией.

    Диаграмма, демонстрирующая взаимодействие бэкэнда удаленной конфигурации с пользовательскими инструментами и серверами.

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

Изменение конфигурации удаленного доступа с помощью Firebase Admin SDK.

Admin SDK — это набор серверных библиотек, позволяющих взаимодействовать с Firebase из привилегированных сред. Помимо обновления Remote Config , Admin SDK обеспечивает генерацию и проверку токенов аутентификации Firebase, чтение и запись из Realtime Database и многое другое. Подробнее о предварительных требованиях и настройке Admin SDK см. в разделе «Добавление Firebase Admin SDK на ваш сервер» .

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

Инициализируйте SDK и авторизуйте запросы к API.

При инициализации Admin SDK без параметров, SDK использует учетные данные Google Application Default Credentials и считывает параметры из переменной среды FIREBASE_CONFIG . Если содержимое переменной FIREBASE_CONFIG начинается с { , оно будет интерпретировано как объект JSON. В противном случае SDK предполагает, что строка является именем файла JSON, содержащего параметры.

Например:

Node.js

const admin = require('firebase-admin');
admin.initializeApp();

Java

FileInputStream serviceAccount = new FileInputStream("service-account.json");
FirebaseOptions options = FirebaseOptions.builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
FirebaseApp.initializeApp(options);

Получите текущий шаблон удаленной конфигурации.

При работе с шаблонами Remote Config следует помнить, что они версионированы, и каждая версия имеет ограниченный срок действия с момента ее создания до момента замены обновлением: 90 дней, с общим лимитом в 300 сохраненных версий. Дополнительную информацию см. в разделе «Шаблоны и версионирование» .

Вы можете использовать API бэкэнда для получения текущей активной версии шаблона Remote Config в формате JSON.

Параметры и значения параметров, созданные специально в качестве вариантов в эксперименте A/B Testing не включаются в экспортируемые шаблоны.

Чтобы получить шаблон:

Node.js

function getTemplate() {
  var config = admin.remoteConfig();
  config.getTemplate()
      .then(function (template) {
        console.log('ETag from server: ' + template.etag);
        var templateStr = JSON.stringify(template);
        fs.writeFileSync('config.json', templateStr);
      })
      .catch(function (err) {
        console.error('Unable to get template');
        console.error(err);
      });
}

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

Изменение параметров удаленной конфигурации

Вы можете программно изменять и добавлять параметры и группы параметров Remote Config . Например, к существующей группе параметров с именем "new_menu" можно добавить параметр для управления отображением сезонной информации:

Node.js

function addParameterToGroup(template) {
  template.parameterGroups['new_menu'].parameters['spring_season'] = {
    defaultValue: {
      useInAppDefault: true
    },
    description: 'spring season menu visibility.',
  };
}

Java

template.getParameterGroups().get("new_menu").getParameters()
        .put("spring_season", new Parameter()
                .setDefaultValue(ParameterValue.inAppDefault())
                .setDescription("spring season menu visibility.")
        );

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

Изменение условий удаленной конфигурации

Вы можете программно изменять и добавлять условия и значения условий Remote Config . Например, чтобы добавить новое условие:

Node.js

function addNewCondition(template) {
  template.conditions.push({
    name: 'android_en',
    expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']',
    tagColor: 'BLUE',
  });
}

Java

template.getConditions().add(new Condition("android_en",
        "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));

Во всех случаях после внесения изменений необходимо обязательно опубликовать шаблон.

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

Проверьте шаблон удаленной конфигурации.

При желании вы можете проверить свои обновления перед публикацией, как показано ниже:

Node.js

function validateTemplate(template) {
  admin.remoteConfig().validateTemplate(template)
      .then(function (validatedTemplate) {
        // The template is valid and safe to use.
        console.log('Template was valid and safe to use');
      })
      .catch(function (err) {
        console.error('Template is invalid and cannot be published');
        console.error(err);
      });
}

Java

try {
  Template validatedTemplate = FirebaseRemoteConfig.getInstance()
          .validateTemplateAsync(template).get();
  System.out.println("Template was valid and safe to use");
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Template is invalid and cannot be published");
    System.out.println(rcError.getMessage());
  }
}

В процессе проверки выявляются ошибки, такие как повторяющиеся ключи для параметров и условий, недопустимые имена условий или несуществующие условия, а также неправильно отформатированные etags. Например, запрос, содержащий больше допустимого количества ключей — 2000 — вернет сообщение об ошибке « Param count too large .

Опубликуйте шаблон удаленной конфигурации.

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

При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, вы можете выполнить проверку перед публикацией .

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

  • Настройки персонализации нельзя импортировать из одного проекта в другой.

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

  • Условия можно импортировать из проекта в проект, но обратите внимание, что любые конкретные значения условий (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.

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

  • Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , Analytics необходимо включить в целевом проекте.

Node.js

function publishTemplate() {
  var config = admin.remoteConfig();
  var template = config.createTemplateFromJSON(
      fs.readFileSync('config.json', 'UTF8'));
  config.publishTemplate(template)
      .then(function (updatedTemplate) {
        console.log('Template has been published');
        console.log('ETag from server: ' + updatedTemplate.etag);
      })
      .catch(function (err) {
        console.error('Unable to publish template.');
        console.error(err);
      });
}

Java

try {
  Template publishedTemplate = FirebaseRemoteConfig.getInstance()
          .publishTemplateAsync(template).get();
  System.out.println("Template has been published");
  // See the ETag of the published template.
  System.out.println("ETag from server: " + publishedTemplate.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Unable to publish template.");
    System.out.println(rcError.getMessage());
  }
}

Изменение удаленной конфигурации с помощью REST API

В этом разделе описаны основные возможности REST API Remote Config по адресу https://firebaseremoteconfig.googleapis.com . Для получения более подробной информации см. справочник по API .

Получите токен доступа для аутентификации и авторизации запросов к API.

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

Вы можете просмотреть все учетные записи служб для вашего проекта Firebase в > Вкладка «Учетные записи служб» .

Для аутентификации учетной записи службы и предоставления ей доступа к сервисам Firebase необходимо сгенерировать файл закрытого ключа в формате JSON.

Чтобы сгенерировать файл закрытого ключа для вашей служебной учетной записи:

  1. В консоли Firebase перейдите в... > Вкладка «Учетные записи служб» .

  2. Нажмите «Сгенерировать новый закрытый ключ» , затем подтвердите, нажав «Сгенерировать ключ» .

  3. Надежно сохраните JSON-файл, содержащий ключ.

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

Чтобы установить переменную среды:

Установите переменную среды GOOGLE_APPLICATION_CREDENTIALS на путь к JSON-файлу, содержащему ключ вашей учетной записи службы. Эта переменная применяется только к текущей сессии оболочки, поэтому, если вы откроете новую сессию, установите переменную снова.

Linux или macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

С помощью PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

После выполнения описанных выше шагов Application Default Credentials (ADC) сможет автоматически определять ваши учетные данные, что позволит вам использовать учетные данные сервисной учетной записи при тестировании или запуске в средах, отличных от Google.

Используйте свои учетные данные Firebase вместе с библиотекой Google Auth для предпочитаемого языка, чтобы получить кратковременный токен доступа OAuth 2.0:

node.js

 function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

В этом примере клиентская библиотека Google API аутентифицирует запрос с помощью JSON-токена (JWT). Дополнительную информацию см. в разделе «JSON-токены» .

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

public static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

После истечения срока действия вашего токена доступа автоматически вызывается метод обновления токена для получения обновленного токена доступа.

Для авторизации доступа к Remote Config запросите область действия https://www.googleapis.com/auth/firebase.remoteconfig .

Измените шаблон удаленной конфигурации.

При работе с шаблонами Remote Config следует помнить, что они версионированы, и каждая версия имеет ограниченный срок действия с момента ее создания до момента замены обновлением: 90 дней, с общим лимитом в 300 сохраненных версий. Дополнительную информацию см. в разделе «Шаблоны и версионирование» .

Получите текущий шаблон удаленной конфигурации.

Вы можете использовать API бэкэнда для получения текущей активной версии шаблона Remote Config в формате JSON.

Параметры и значения параметров, созданные специально в качестве вариантов в эксперименте A/B Testing не включаются в экспортируемые шаблоны.

Используйте следующие команды:

cURL

curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename

Эта команда выводит полезную нагрузку JSON в один файл, а заголовки (включая Etag) — в отдельный файл.

Необработанный HTTP-запрос

Host: firebaseremoteconfig.googleapis.com

GET /v1/projects/my-project-id/remoteConfig HTTP/1.1
Authorization: Bearer token
Accept-Encoding: gzip

Этот вызов API возвращает следующий JSON, а также отдельный заголовок, содержащий ETag , который вы используете для последующего запроса.

Проверьте шаблон удаленной конфигурации.

При желании вы можете проверить свои обновления перед публикацией. Для проверки обновлений шаблона добавьте к запросу на публикацию параметр URL ?validate_only=true . В ответе код состояния 200 и обновленный etag с суффиксом -0 означают, что ваше обновление было успешно проверено. Любой ответ, отличный от 200, указывает на то, что данные JSON содержат ошибки, которые необходимо исправить перед публикацией.

Обновите шаблон удаленной конфигурации.

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

При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, вы можете выполнить проверку перед публикацией .

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

  • Настройки персонализации нельзя импортировать из одного проекта в другой.

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

  • Условия можно импортировать из проекта в проект, но обратите внимание, что любые конкретные значения условий (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.

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

  • Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , Analytics необходимо включить в целевом проекте.

cURL

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename

Для этой команды curl вы можете указать содержимое, используя символ "@", за которым следует имя файла.

Необработанный HTTP-запрос

Host: firebaseremoteconfig.googleapis.com
PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1
Content-Length: size
Content-Type: application/json; UTF8
Authorization: Bearer token
If-Match: expected ETag
Accept-Encoding: gzip
JSON_HERE

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

Изменение условий удаленной конфигурации

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

{
  "conditions": [{
    "name": "android_english",
    "expression": "device.os == 'android' && device.country in ['us', 'uk']",
    "tagColor": "BLUE"
  }, {
    "name": "tenPercent",
    "expression": "percent <= 10",
    "tagColor": "BROWN"
  }],
  "parameters": {
    "welcome_message": {
      "defaultValue": {
        "value": "Welcome to this sample app"
      },
      "conditionalValues": {
        "tenPercent": {
          "value": "Welcome to this new sample app"
        }
      },
      "description": "The sample app's welcome message"
    },
    "welcome_message_caps": {
      "defaultValue": {
        "value": "false"
      },
      "conditionalValues": {
        "android_english": {
          "value": "true"
        }
      },
      "description": "Whether the welcome message should be displayed in all capital letters."
    }
  }
}

Описанные выше изменения сначала определяют набор условий, а затем задают значения по умолчанию и значения параметров, зависящие от условий ( условные значения ) для каждого параметра. Также добавляется необязательное описание для каждого элемента; подобно комментариям к коду, оно предназначено для использования разработчиками и не отображается в приложении. Для целей контроля версий также предоставляется ETag .

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

Коды ошибок HTTP

Код состояния Значение
200 Обновлено успешно
400 Произошла ошибка проверки. Например, запрос, содержащий большее количество ключей, чем разрешено (2000), вернет код 400 (Неверный запрос) с сообщением об ошибке « Param count too large . Кроме того, этот код состояния HTTPS может появиться в двух следующих ситуациях:
  • Произошла ошибка несоответствия версий, поскольку набор значений и условий был обновлен с момента последнего получения значения ETag. Для устранения этой проблемы следует использовать команду GET для получения нового шаблона и значения ETag, обновить шаблон, а затем отправить запрос, используя этот шаблон и новое значение ETag.
  • Была выполнена команда PUT (запрос на обновление шаблона Remote Config ) без указания заголовка If-Match .
401 Произошла ошибка авторизации (не предоставлен токен доступа или REST API Firebase Remote Config не добавлен в ваш проект в консоли разработчика Cloud).
403 Произошла ошибка аутентификации (был предоставлен неверный токен доступа).
500 Произошла внутренняя ошибка. В случае возникновения этой ошибки создайте заявку в службу поддержки Firebase.

Код состояния 200 означает, что шаблон Remote Config (параметры, значения и условия для проекта) был обновлен и теперь доступен приложениям, использующим этот проект. Другие коды состояния указывают на то, что ранее существовавший шаблон Remote Config все еще действует.

После отправки изменений в шаблон перейдите в консоль Firebase , чтобы убедиться, что ваши изменения отображаются должным образом. Это очень важно, поскольку порядок условий влияет на то, как они оцениваются (вступает в силу первое условие, которое оценивается true ).

Использование ETag и принудительные обновления

REST API Remote Config использует тег сущности (ETag) для предотвращения состояний гонки и дублирования обновлений ресурсов. Подробнее об ETag можно узнать в разделе ETag - HTTP .

Для REST API Google рекомендует кэшировать ETag, полученный из последней команды GET , и использовать это значение ETag в заголовке запроса If-Match при выполнении команд PUT . Если ваша команда PUT приводит к коду состояния HTTPS 409, следует выполнить новую команду GET , чтобы получить новый ETag и шаблон для использования в следующей команде PUT .

Вы можете обойти ETag и предоставляемую им защиту, принудительно обновив шаблон Remote Config следующим образом: If-Match: * Однако этот подход не рекомендуется, поскольку существует риск потери обновлений шаблона Remote Config , если несколько клиентов обновляют этот шаблон Remote Config . Подобный конфликт может возникнуть при использовании API несколькими клиентами или при конфликтующих обновлениях от клиентов API и пользователей консоли Firebase .

Рекомендации по управлению версиями шаблонов Remote Config см. в разделе «Шаблоны Remote Config и версионирование» .

,

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

Используя REST API Remote Config или Admin SDK , описанные в этом руководстве, вы можете обойтись без управления шаблоном в консоли Firebase и напрямую интегрировать изменения Remote Config в свои собственные процессы. Например, с помощью бэкэнд-API Remote Config вы можете:

  • Планирование обновлений Remote Config . Используя вызовы API в сочетании с заданием cron, вы можете регулярно изменять значения Remote Config по расписанию.
  • Пакетный импорт значений конфигурации позволит эффективно перейти от вашей собственной проприетарной системы к Firebase Remote Config .
  • Используйте Remote Config с Cloud Functions for Firebase , изменяя значения в вашем приложении на основе событий, происходящих на стороне сервера. Например, вы можете использовать Remote Config для продвижения новой функции в вашем приложении, а затем автоматически отключить это продвижение, как только обнаружите, что достаточное количество людей взаимодействовало с новой функцией.

    Диаграмма, демонстрирующая взаимодействие бэкэнда удаленной конфигурации с пользовательскими инструментами и серверами.

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

Изменение конфигурации удаленного доступа с помощью Firebase Admin SDK.

Admin SDK — это набор серверных библиотек, позволяющих взаимодействовать с Firebase из привилегированных сред. Помимо обновления Remote Config , Admin SDK обеспечивает генерацию и проверку токенов аутентификации Firebase, чтение и запись из Realtime Database и многое другое. Подробнее о предварительных требованиях и настройке Admin SDK см. в разделе «Добавление Firebase Admin SDK на ваш сервер» .

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

Инициализируйте SDK и авторизуйте запросы к API.

При инициализации Admin SDK без параметров, SDK использует учетные данные Google Application Default Credentials и считывает параметры из переменной среды FIREBASE_CONFIG . Если содержимое переменной FIREBASE_CONFIG начинается с { , оно будет интерпретировано как объект JSON. В противном случае SDK предполагает, что строка является именем файла JSON, содержащего параметры.

Например:

Node.js

const admin = require('firebase-admin');
admin.initializeApp();

Java

FileInputStream serviceAccount = new FileInputStream("service-account.json");
FirebaseOptions options = FirebaseOptions.builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
FirebaseApp.initializeApp(options);

Получите текущий шаблон удаленной конфигурации.

При работе с шаблонами Remote Config следует помнить, что они версионированы, и каждая версия имеет ограниченный срок действия с момента ее создания до момента замены обновлением: 90 дней, с общим лимитом в 300 сохраненных версий. Дополнительную информацию см. в разделе «Шаблоны и версионирование» .

Вы можете использовать API бэкэнда для получения текущей активной версии шаблона Remote Config в формате JSON.

Параметры и значения параметров, созданные специально в качестве вариантов в эксперименте A/B Testing не включаются в экспортируемые шаблоны.

Чтобы получить шаблон:

Node.js

function getTemplate() {
  var config = admin.remoteConfig();
  config.getTemplate()
      .then(function (template) {
        console.log('ETag from server: ' + template.etag);
        var templateStr = JSON.stringify(template);
        fs.writeFileSync('config.json', templateStr);
      })
      .catch(function (err) {
        console.error('Unable to get template');
        console.error(err);
      });
}

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

Изменение параметров удаленной конфигурации

Вы можете программно изменять и добавлять параметры и группы параметров Remote Config . Например, к существующей группе параметров с именем "new_menu" можно добавить параметр для управления отображением сезонной информации:

Node.js

function addParameterToGroup(template) {
  template.parameterGroups['new_menu'].parameters['spring_season'] = {
    defaultValue: {
      useInAppDefault: true
    },
    description: 'spring season menu visibility.',
  };
}

Java

template.getParameterGroups().get("new_menu").getParameters()
        .put("spring_season", new Parameter()
                .setDefaultValue(ParameterValue.inAppDefault())
                .setDescription("spring season menu visibility.")
        );

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

Изменение условий удаленной конфигурации

Вы можете программно изменять и добавлять условия и значения условий Remote Config . Например, чтобы добавить новое условие:

Node.js

function addNewCondition(template) {
  template.conditions.push({
    name: 'android_en',
    expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']',
    tagColor: 'BLUE',
  });
}

Java

template.getConditions().add(new Condition("android_en",
        "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));

Во всех случаях после внесения изменений необходимо обязательно опубликовать шаблон.

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

Проверьте шаблон удаленной конфигурации.

При желании вы можете проверить свои обновления перед публикацией, как показано ниже:

Node.js

function validateTemplate(template) {
  admin.remoteConfig().validateTemplate(template)
      .then(function (validatedTemplate) {
        // The template is valid and safe to use.
        console.log('Template was valid and safe to use');
      })
      .catch(function (err) {
        console.error('Template is invalid and cannot be published');
        console.error(err);
      });
}

Java

try {
  Template validatedTemplate = FirebaseRemoteConfig.getInstance()
          .validateTemplateAsync(template).get();
  System.out.println("Template was valid and safe to use");
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Template is invalid and cannot be published");
    System.out.println(rcError.getMessage());
  }
}

В процессе проверки выявляются ошибки, такие как повторяющиеся ключи для параметров и условий, недопустимые имена условий или несуществующие условия, а также неправильно отформатированные etags. Например, запрос, содержащий больше допустимого количества ключей — 2000 — вернет сообщение об ошибке « Param count too large .

Опубликуйте шаблон удаленной конфигурации.

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

При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, вы можете выполнить проверку перед публикацией .

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

  • Настройки персонализации нельзя импортировать из одного проекта в другой.

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

  • Условия можно импортировать из проекта в проект, но обратите внимание, что любые конкретные значения условий (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.

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

  • Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , Analytics необходимо включить в целевом проекте.

Node.js

function publishTemplate() {
  var config = admin.remoteConfig();
  var template = config.createTemplateFromJSON(
      fs.readFileSync('config.json', 'UTF8'));
  config.publishTemplate(template)
      .then(function (updatedTemplate) {
        console.log('Template has been published');
        console.log('ETag from server: ' + updatedTemplate.etag);
      })
      .catch(function (err) {
        console.error('Unable to publish template.');
        console.error(err);
      });
}

Java

try {
  Template publishedTemplate = FirebaseRemoteConfig.getInstance()
          .publishTemplateAsync(template).get();
  System.out.println("Template has been published");
  // See the ETag of the published template.
  System.out.println("ETag from server: " + publishedTemplate.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Unable to publish template.");
    System.out.println(rcError.getMessage());
  }
}

Изменение удаленной конфигурации с помощью REST API

В этом разделе описаны основные возможности REST API Remote Config по адресу https://firebaseremoteconfig.googleapis.com . Для получения более подробной информации см. справочник по API .

Получите токен доступа для аутентификации и авторизации запросов к API.

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

Вы можете просмотреть все учетные записи служб для вашего проекта Firebase в > Вкладка «Учетные записи служб» .

Для аутентификации учетной записи службы и предоставления ей доступа к сервисам Firebase необходимо сгенерировать файл закрытого ключа в формате JSON.

Чтобы сгенерировать файл закрытого ключа для вашей служебной учетной записи:

  1. В консоли Firebase перейдите в... > Вкладка «Учетные записи служб» .

  2. Нажмите «Сгенерировать новый закрытый ключ» , затем подтвердите, нажав «Сгенерировать ключ» .

  3. Надежно сохраните JSON-файл, содержащий ключ.

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

Чтобы установить переменную среды:

Установите переменную среды GOOGLE_APPLICATION_CREDENTIALS на путь к JSON-файлу, содержащему ключ вашей учетной записи службы. Эта переменная применяется только к текущей сессии оболочки, поэтому, если вы откроете новую сессию, установите переменную снова.

Linux или macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

С помощью PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

После выполнения описанных выше шагов Application Default Credentials (ADC) сможет автоматически определять ваши учетные данные, что позволит вам использовать учетные данные сервисной учетной записи при тестировании или запуске в средах, отличных от Google.

Используйте свои учетные данные Firebase вместе с библиотекой Google Auth для предпочитаемого языка, чтобы получить кратковременный токен доступа OAuth 2.0:

node.js

 function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

В этом примере клиентская библиотека Google API аутентифицирует запрос с помощью JSON-токена (JWT). Дополнительную информацию см. в разделе «JSON-токены» .

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

public static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

После истечения срока действия вашего токена доступа автоматически вызывается метод обновления токена для получения обновленного токена доступа.

Для авторизации доступа к Remote Config запросите область действия https://www.googleapis.com/auth/firebase.remoteconfig .

Измените шаблон удаленной конфигурации.

При работе с шаблонами Remote Config следует помнить, что они версионированы, и каждая версия имеет ограниченный срок действия с момента ее создания до момента замены обновлением: 90 дней, с общим лимитом в 300 сохраненных версий. Дополнительную информацию см. в разделе «Шаблоны и версионирование» .

Получите текущий шаблон удаленной конфигурации.

Вы можете использовать API бэкэнда для получения текущей активной версии шаблона Remote Config в формате JSON.

Параметры и значения параметров, созданные специально в качестве вариантов в эксперименте A/B Testing не включаются в экспортируемые шаблоны.

Используйте следующие команды:

cURL

curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename

Эта команда выводит полезную нагрузку JSON в один файл, а заголовки (включая Etag) — в отдельный файл.

Необработанный HTTP-запрос

Host: firebaseremoteconfig.googleapis.com

GET /v1/projects/my-project-id/remoteConfig HTTP/1.1
Authorization: Bearer token
Accept-Encoding: gzip

Этот вызов API возвращает следующий JSON, а также отдельный заголовок, содержащий ETag , который вы используете для последующего запроса.

Проверьте шаблон удаленной конфигурации.

При желании вы можете проверить свои обновления перед публикацией. Для проверки обновлений шаблона добавьте к запросу на публикацию параметр URL ?validate_only=true . В ответе код состояния 200 и обновленный etag с суффиксом -0 означают, что ваше обновление было успешно проверено. Любой ответ, отличный от 200, указывает на то, что данные JSON содержат ошибки, которые необходимо исправить перед публикацией.

Обновите шаблон удаленной конфигурации.

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

При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, вы можете выполнить проверку перед публикацией .

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

  • Настройки персонализации нельзя импортировать из одного проекта в другой.

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

  • Условия можно импортировать из проекта в проект, но обратите внимание, что любые конкретные значения условий (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.

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

  • Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , Analytics необходимо включить в целевом проекте.

cURL

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename

Для этой команды curl вы можете указать содержимое, используя символ "@", за которым следует имя файла.

Необработанный HTTP-запрос

Host: firebaseremoteconfig.googleapis.com
PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1
Content-Length: size
Content-Type: application/json; UTF8
Authorization: Bearer token
If-Match: expected ETag
Accept-Encoding: gzip
JSON_HERE

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

Изменение условий удаленной конфигурации

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

{
  "conditions": [{
    "name": "android_english",
    "expression": "device.os == 'android' && device.country in ['us', 'uk']",
    "tagColor": "BLUE"
  }, {
    "name": "tenPercent",
    "expression": "percent <= 10",
    "tagColor": "BROWN"
  }],
  "parameters": {
    "welcome_message": {
      "defaultValue": {
        "value": "Welcome to this sample app"
      },
      "conditionalValues": {
        "tenPercent": {
          "value": "Welcome to this new sample app"
        }
      },
      "description": "The sample app's welcome message"
    },
    "welcome_message_caps": {
      "defaultValue": {
        "value": "false"
      },
      "conditionalValues": {
        "android_english": {
          "value": "true"
        }
      },
      "description": "Whether the welcome message should be displayed in all capital letters."
    }
  }
}

Описанные выше изменения сначала определяют набор условий, а затем задают значения по умолчанию и значения параметров, зависящие от условий ( условные значения ) для каждого параметра. Также добавляется необязательное описание для каждого элемента; подобно комментариям к коду, оно предназначено для использования разработчиками и не отображается в приложении. Для целей контроля версий также предоставляется ETag .

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

Коды ошибок HTTP

Код состояния Значение
200 Обновлено успешно
400 Произошла ошибка проверки. Например, запрос, содержащий большее количество ключей, чем разрешено (2000), вернет код 400 (Неверный запрос) с сообщением об ошибке « Param count too large . Кроме того, этот код состояния HTTPS может появиться в двух следующих ситуациях:
  • Произошла ошибка несоответствия версий, поскольку набор значений и условий был обновлен с момента последнего получения значения ETag. Для устранения этой проблемы следует использовать команду GET для получения нового шаблона и значения ETag, обновить шаблон, а затем отправить запрос, используя этот шаблон и новое значение ETag.
  • Была выполнена команда PUT (запрос на обновление шаблона Remote Config ) без указания заголовка If-Match .
401 Произошла ошибка авторизации (не предоставлен токен доступа или REST API Firebase Remote Config не добавлен в ваш проект в консоли разработчика Cloud).
403 Произошла ошибка аутентификации (был предоставлен неверный токен доступа).
500 Произошла внутренняя ошибка. В случае возникновения этой ошибки создайте заявку в службу поддержки Firebase.

Код состояния 200 означает, что шаблон Remote Config (параметры, значения и условия для проекта) был обновлен и теперь доступен приложениям, использующим этот проект. Другие коды состояния указывают на то, что ранее существовавший шаблон Remote Config все еще действует.

После отправки изменений в шаблон перейдите в консоль Firebase , чтобы убедиться, что ваши изменения отображаются должным образом. Это очень важно, поскольку порядок условий влияет на то, как они оцениваются (вступает в силу первое условие, которое оценивается true ).

Использование ETag и принудительные обновления

REST API Remote Config использует тег сущности (ETag) для предотвращения состояний гонки и дублирования обновлений ресурсов. Подробнее об ETag можно узнать в разделе ETag - HTTP .

For the REST API, Google recommends that you cache the ETag provided by the most recent GET command, and use that ETag value in the If-Match request header when issuing PUT commands. If your PUT command results in an HTTPS Status Code 409, you should issue a fresh GET command to acquire a new ETag and template to use with your next PUT command.

You can circumvent the ETag, and the protection from that it provides, by forcing the Remote Config template to be updated as follows: If-Match: * However, this approach is not recommended because it risks causing the loss of updates to your Remote Config template if multiple clients are updating the Remote Config template. This kind of conflict could occur with multiple clients using the API, or with conflicting updates from API clients and Firebase console users.

For guidance on managing Remote Config template versions, see Remote Config templates and versioning .