Modificar Remote Config programáticamente

Este documento describe cómo puede leer y modificar mediante programación el conjunto de parámetros y condiciones con formato JSON conocido como plantilla de Remote Config . Esto le permite realizar cambios en la plantilla en el backend que la aplicación cliente puede recuperar usando la biblioteca del cliente.

Con la API REST de Remote Config o los SDK de administración descritos en esta guía, puede omitir la administración de la plantilla en Firebase console para integrar directamente los cambios de Remote Config en sus propios procesos. Por ejemplo, con las API de backend de Remote Config, podrías:

  • Programación de actualizaciones de Remote Config . Al utilizar llamadas API junto con una tarea cron, puede cambiar los valores de Remote Config periódicamente.
  • Importe valores de configuración por lotes para realizar una transición eficiente desde su propio sistema propietario a Firebase Remote Config.
  • Utilice Remote Config con Cloud Functions para Firebase y cambie los valores en su aplicación según los eventos que ocurren en el lado del servidor. Por ejemplo, puede usar Remote Config para promocionar una nueva función en su aplicación y luego desactivar esa promoción automáticamente una vez que detecte que suficientes personas han interactuado con la nueva función.

    Diagrama que muestra el backend de Remote Config interactuando con herramientas y servidores personalizados

Las siguientes secciones de esta guía describen las operaciones que puede realizar con las API de backend de Remote Config. Para revisar algún código que realiza estas tareas a través de la API REST, consulte una de estas aplicaciones de ejemplo:

Modificar Remote Config usando el SDK de administrador de Firebase

El SDK de administración es un conjunto de bibliotecas de servidor que le permiten interactuar con Firebase desde entornos privilegiados. Además de realizar actualizaciones de Remote Config, el SDK de administración permite la generación y verificación de tokens de autenticación de Firebase, la lectura y escritura desde Realtime Database, etc. Para obtener más información sobre los requisitos previos y la configuración del SDK de administración, consulte Agregar el SDK de administración de Firebase a su servidor .

En un flujo típico de Remote Config, puede obtener la plantilla actual, modificar algunos de los parámetros o grupos de parámetros y condiciones, validar la plantilla y luego publicarla. Antes de realizar esas llamadas a la API, debe autorizar las solicitudes del SDK.

Inicialice el SDK y autorice las solicitudes de API

Cuando inicializa el SDK de administración sin parámetros, el SDK utiliza las credenciales predeterminadas de la aplicación de Google y lee las opciones de la variable de entorno FIREBASE_CONFIG . Si el contenido de la variable FIREBASE_CONFIG comienza con { se analizará como un objeto JSON. De lo contrario, el SDK supone que la cadena es el nombre de un archivo JSON que contiene las opciones.

Por ejemplo:

Nodo.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);

Obtenga la plantilla de configuración remota actual

Cuando trabaje con plantillas de Remote Config, tenga en cuenta que están versionadas y que cada versión tiene una vida útil limitada desde el momento de su creación hasta el momento en que la reemplaza con una actualización: 90 días, con un límite total de 300 versiones almacenadas. Consulte Plantillas y versiones para obtener más información.

Puede utilizar las API de backend para obtener la versión activa actual de la plantilla de Remote Config en formato JSON.

Los parámetros y valores de parámetros creados específicamente como variantes en un experimento de prueba A/B no se incluyen en las plantillas exportadas.

Para obtener la plantilla:

Nodo.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());

Modificar los parámetros de configuración remota

Puede modificar y agregar parámetros y grupos de parámetros de Remote Config mediante programación. Por ejemplo, a un grupo de parámetros existente llamado "nuevo_menú" podría agregar un parámetro para controlar la visualización de información estacional:

Nodo.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.")
        );

La API le permite crear nuevos parámetros y grupos de parámetros, o modificar valores predeterminados, valores condicionales y descripciones. En todos los casos, debes publicar explícitamente la plantilla después de realizar modificaciones.

Modificar las condiciones de Remote Config

Puede modificar y agregar condiciones y valores condicionales de Remote Config mediante programación. Por ejemplo, para agregar una nueva condición:

Nodo.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));

En todos los casos, debes publicar explícitamente la plantilla después de realizar modificaciones.

Las API de backend de Remote Config proporcionan varias condiciones y operadores de comparación que puede usar para cambiar el comportamiento y la apariencia de su aplicación. Para obtener más información sobre las condiciones y los operadores admitidos para estas condiciones, consulte la referencia de expresiones condicionales .

Validar la plantilla de Remote Config

Opcionalmente, puede validar sus actualizaciones antes de publicarlas, como se muestra:

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

Este proceso de validación busca errores como claves duplicadas para parámetros y condiciones, nombres de condiciones no válidos o condiciones inexistentes, o etiquetas electrónicas con formato incorrecto. Por ejemplo, una solicitud que contenga más de la cantidad permitida de claves (2000) devolvería el mensaje de error Param count too large .

Publicar la plantilla de Remote Config

Después de recuperar una plantilla y revisarla con las actualizaciones deseadas, podrá publicarla. La publicación de una plantilla como se describe en esta sección reemplaza toda la plantilla de configuración existente con el archivo actualizado, y a la nueva plantilla activa se le asigna un número de versión un número mayor que la plantilla que reemplazó.

Si es necesario, puede utilizar la API REST para volver a la versión anterior . Para mitigar el riesgo de errores en una actualización, puedes validarla antes de publicarla .

Las personalizaciones y condiciones de Remote Config se incluyen en las plantillas descargadas, por lo que es importante tener en cuenta las siguientes limitaciones al intentar publicar en un proyecto diferente:

  • Las personalizaciones no se pueden importar de un proyecto a otro.

    Por ejemplo, si tiene personalizaciones habilitadas en su proyecto y descarga y edita una plantilla, puede publicarla en el mismo proyecto, pero no puede publicarla en un proyecto diferente a menos que elimine las personalizaciones de la plantilla.

  • Las condiciones se pueden importar de un proyecto a otro, pero tenga en cuenta que cualquier valor condicional específico (como ID de aplicación o audiencias) debe existir en el proyecto de destino antes de publicarlo.

    Por ejemplo, si tiene un parámetro de Remote Config que usa una condición que especifica un valor de plataforma de iOS , la plantilla se puede publicar en otro proyecto, porque los valores de plataforma son los mismos para cualquier proyecto. Sin embargo, si contiene una condición que se basa en un ID de aplicación específico o una audiencia de usuarios que no existe en el proyecto de destino, la validación fallará.

  • Si la plantilla que planea publicar contiene condiciones que dependen de Google Analytics, Analytics debe estar habilitado en el proyecto de destino.

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

Modificar Remote Config usando la API REST

Esta sección describe las capacidades principales de la API REST de Remote Config en https://firebaseremoteconfig.googleapis.com . Para obtener detalles completos, consulte la referencia de API .

Obtenga un token de acceso para autenticar y autorizar solicitudes de API

Los proyectos de Firebase admiten cuentas de servicio de Google, que puedes usar para llamar a las API del servidor de Firebase desde tu servidor de aplicaciones o entorno confiable. Si está desarrollando código localmente o implementando su aplicación localmente, puede usar las credenciales obtenidas a través de esta cuenta de servicio para autorizar las solicitudes del servidor.

Para autenticar una cuenta de servicio y autorizarla a acceder a los servicios de Firebase, debe generar un archivo de clave privada en formato JSON.

Para generar un archivo de clave privada para su cuenta de servicio:

  1. En Firebase console, abre Configuración > Cuentas de servicio .

  2. Haga clic en Generar nueva clave privada y luego confirme haciendo clic en Generar clave .

  3. Almacene de forma segura el archivo JSON que contiene la clave.

Al realizar la autorización a través de una cuenta de servicio, tiene dos opciones para proporcionar las credenciales a su aplicación. Puede configurar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS o puede pasar explícitamente la ruta a la clave de la cuenta de servicio en el código. La primera opción es más segura y muy recomendable.

Para configurar la variable de entorno:

Establezca la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta del archivo JSON que contiene su clave de cuenta de servicio. Esta variable solo se aplica a su sesión actual de Shell, por lo que si abre una nueva sesión, configure la variable nuevamente.

Linux o macOS

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

ventanas

Con PowerShell:

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

Una vez que haya completado los pasos anteriores, las Credenciales predeterminadas de la aplicación (ADC) pueden determinar implícitamente sus credenciales, lo que le permite utilizar las credenciales de la cuenta de servicio al realizar pruebas o ejecutarlas en entornos que no son de Google.

Utilice sus credenciales de Firebase junto con la biblioteca de autenticación de Google para su idioma preferido para recuperar un token de acceso OAuth 2.0 de corta duración:

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

En este ejemplo, la biblioteca cliente API de Google autentica la solicitud con un token web JSON o JWT. Para obtener más información, consulte Tokens web JSON .

Pitón

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

Una vez que caduque su token de acceso, se llama automáticamente al método de actualización del token para recuperar un token de acceso actualizado.

Para autorizar el acceso a Remote Config, solicite el alcance https://www.googleapis.com/auth/firebase.remoteconfig .

Modificar la plantilla de Remote Config

Cuando trabaje con plantillas de Remote Config, tenga en cuenta que están versionadas y que cada versión tiene una vida útil limitada desde el momento de su creación hasta el momento en que la reemplaza con una actualización: 90 días, con un límite total de 300 versiones almacenadas. Consulte Plantillas y versiones para obtener más información.

Obtenga la plantilla de configuración remota actual

Puede utilizar las API de backend para obtener la versión activa actual de la plantilla de Remote Config en formato JSON.

Los parámetros y valores de parámetros creados específicamente como variantes en un experimento de prueba A/B no se incluyen en las plantillas exportadas.

Utilice los siguientes comandos:

rizo

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

Este comando genera la carga útil JSON en un archivo y los encabezados (incluido el Etag) en un archivo separado.

Solicitud HTTP sin formato

Host: firebaseremoteconfig.googleapis.com

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

Esta llamada API devuelve el siguiente JSON, junto con un encabezado independiente que incluye una ETag que utiliza para la solicitud posterior.

Validar la plantilla de Remote Config

Opcionalmente, puede validar sus actualizaciones antes de publicarlas. Valide las actualizaciones de la plantilla agregando a su solicitud de publicación el parámetro de URL ?validate_only=true . En la respuesta, un código de estado 200 y una etiqueta etag actualizada con el sufijo -0 significan que su actualización se validó correctamente. Cualquier respuesta que no sea 200 indica que los datos JSON contienen errores que debe corregir antes de publicarlos.

Actualizar la plantilla de Remote Config

Después de recuperar una plantilla y revisar el contenido JSON con las actualizaciones deseadas, podrá publicarla. La publicación de una plantilla como se describe en esta sección reemplaza toda la plantilla de configuración existente con el archivo actualizado, y a la nueva plantilla activa se le asigna un número de versión un número mayor que la plantilla que reemplazó.

Si es necesario, puede utilizar la API REST para volver a la versión anterior . Para mitigar el riesgo de errores en una actualización, puedes validarla antes de publicarla .

Las personalizaciones y condiciones de Remote Config se incluyen en las plantillas descargadas, por lo que es importante tener en cuenta las siguientes limitaciones al intentar publicar en un proyecto diferente:

  • Las personalizaciones no se pueden importar de un proyecto a otro.

    Por ejemplo, si tiene personalizaciones habilitadas en su proyecto y descarga y edita una plantilla, puede publicarla en el mismo proyecto, pero no puede publicarla en un proyecto diferente a menos que elimine las personalizaciones de la plantilla.

  • Las condiciones se pueden importar de un proyecto a otro, pero tenga en cuenta que cualquier valor condicional específico (como ID de aplicación o audiencias) debe existir en el proyecto de destino antes de publicarlo.

    Por ejemplo, si tiene un parámetro de Remote Config que usa una condición que especifica un valor de plataforma de iOS , la plantilla se puede publicar en otro proyecto, porque los valores de plataforma son los mismos para cualquier proyecto. Sin embargo, si contiene una condición que se basa en un ID de aplicación específico o una audiencia de usuarios que no existe en el proyecto de destino, la validación fallará.

  • Si la plantilla que planea publicar contiene condiciones que dependen de Google Analytics, Analytics debe estar habilitado en el proyecto de destino.

rizo

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

Para este comando curl , puede especificar el contenido utilizando el carácter "@", seguido del nombre del archivo.

Solicitud HTTP sin formato

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

Debido a que se trata de una solicitud de escritura, este comando modifica la ETag y se proporciona una ETag actualizada en los encabezados de respuesta del siguiente comando PUT .

Modificar las condiciones de Remote Config

Puede modificar mediante programación las condiciones y los valores condicionales de Remote Config. Con la API REST, debe editar la plantilla directamente para modificar las condiciones antes de publicarla.

{
  "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."
    }
  }
}

Las modificaciones anteriores primero definen un conjunto de condiciones y luego definen valores predeterminados y valores de parámetros basados ​​en condiciones ( valores condicionales ) para cada parámetro. También agrega una descripción opcional para cada elemento; Al igual que los comentarios de código, son para uso de los desarrolladores y no se muestran en la aplicación. También se proporciona una ETag para fines de control de versiones.

Las API de backend de Remote Config proporcionan varias condiciones y operadores de comparación que puede usar para cambiar el comportamiento y la apariencia de su aplicación. Para obtener más información sobre las condiciones y los operadores admitidos para estas condiciones, consulte la referencia de expresiones condicionales .

Códigos de error HTTP

Código de estado Significado
200 Actualizado exitosamente
400 Se produjo un error de validación. Por ejemplo, una solicitud que contenga más de la cantidad permitida de claves (2000) devolvería 400 (Solicitud incorrecta) con el mensaje de error Param count too large . Además, este código de estado HTTPS puede ocurrir en estas dos situaciones:
  • Se produjo un error de discrepancia de versión porque el conjunto de valores y condiciones se actualizó desde la última vez que recuperó un valor de ETag. Para resolver esto, debe usar un comando GET para obtener una plantilla y un valor de ETag nuevos, actualizar la plantilla y luego enviarla usando esa plantilla y el valor de ETag nuevo.
  • Se realizó un comando PUT (solicitud de actualización de plantilla de configuración remota) sin especificar un encabezado If-Match .
401 Se produjo un error de autorización (no se proporcionó ningún token de acceso o la API REST de Firebase Remote Config no se agregó a su proyecto en Cloud Developer Console)
403 Se produjo un error de autenticación (se proporcionó el token de acceso incorrecto)
500 Ha ocurrido un error interno. Si se produce este error, presente un ticket de soporte de Firebase

Un código de estado de 200 significa que la plantilla de Remote Config (parámetros, valores y condiciones para el proyecto) se ha actualizado y ahora está disponible para las aplicaciones que usan este proyecto. Otros códigos de estado indican que la plantilla de Remote Config que existía anteriormente todavía está vigente.

Después de enviar actualizaciones a su plantilla, vaya a Firebase console para verificar que sus cambios aparezcan como se esperaba. Esto es fundamental porque el orden de las condiciones afecta la forma en que se evalúan (la primera condición que se evalúa true entra en vigor).

Uso de ETag y actualizaciones forzadas

La API REST de Remote Config utiliza una etiqueta de entidad (ETag) para evitar condiciones de carrera y actualizaciones superpuestas de recursos. Para obtener más información sobre ETags, consulte ETag - HTTP .

Para la API REST, Google recomienda almacenar en caché la ETag proporcionada por el comando GET más reciente y usar ese valor de ETag en el encabezado de solicitud If-Match al emitir comandos PUT . Si su comando PUT genera un código de estado HTTPS 409, debe emitir un comando GET nuevo para adquirir una nueva ETag y plantilla para usar con su próximo comando PUT .

Puede eludir la ETag y la protección que proporciona al forzar la actualización de la plantilla de Remote Config de la siguiente manera: If-Match: * Sin embargo, no se recomienda este enfoque porque corre el riesgo de causar la pérdida de actualizaciones de su Remote Config. plantilla si varios clientes están actualizando la plantilla de Remote Config. Este tipo de conflicto podría ocurrir con varios clientes que usan la API o con actualizaciones conflictivas de clientes de API y usuarios de Firebase Console.

Para obtener orientación sobre cómo administrar las versiones de las plantillas de Remote Config, consulte Plantillas y control de versiones de Remote Config .