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

    Диаграмма, показывающая взаимодействие бэкэнда 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();

Ява

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

Ява

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.',
  };
}

Ява

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',
  });
}

Ява

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

Ява

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

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

Ява

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, необходимо сгенерировать файл закрытого ключа в формате 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"

Окна

С PowerShell:

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

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

Используйте свои учетные данные Firebase вместе с библиотекой Google Auth Library для предпочитаемого вами языка, чтобы получить кратковременный токен доступа 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);
      });
}

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

Питон

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

Ява

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 Произошла ошибка авторизации (токен доступа не был предоставлен или API Firebase Remote Config REST не был добавлен в ваш проект в Cloud Developer Console)
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 и управление версиями .