Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Modificar Remote Config programáticamente

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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 configuración remota . Esto le permite realizar cambios en la plantilla en el backend que la aplicación del cliente puede obtener usando la biblioteca del cliente.

Con la API REST de Remote Config o los SDK de administrador 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 back-end de Remote Config, podría:

  • Programación de actualizaciones de configuración remota . Mediante el uso de llamadas API junto con un trabajo cron, puede cambiar los valores de configuración remota en un horario regular.
  • Importe los valores de configuración por lotes para realizar una transición eficiente de su propio sistema propietario a Firebase Remote Config.
  • Use Remote Config con Cloud Functions para Firebase , cambiando los valores en su aplicación en función de 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 back-end 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 muestra:

Modificar Remote Config usando el SDK de administración de Firebase

Admin SDK es un conjunto de bibliotecas de servidor que le permiten interactuar con Firebase desde entornos privilegiados. Además de realizar actualizaciones de Remote Config, Admin SDK permite generar y verificar tokens de autenticación de Firebase, leer y escribir desde Realtime Database, etc. Para obtener más información sobre los requisitos previos y la configuración del SDK de administrador, consulte Agregar el SDK de administrador 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 administrador 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 asume 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 configuración remota, 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 control de versiones para obtener más información.

Puede usar las API de back-end para obtener la versión activa actual de la plantilla de configuración remota 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 parámetros de configuración remota

Puede modificar y agregar mediante programación parámetros y grupos de parámetros de Remote Config. Por ejemplo, a un grupo de parámetros existente llamado "nuevo_menú" podría agregar un parámetro para controlar la visualización de la 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, debe publicar explícitamente la plantilla después de realizar modificaciones.

Modificar las condiciones de configuración remota

Puede modificar y agregar mediante programación condiciones de configuración remota y valores condicionales. 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, debe publicar explícitamente la plantilla después de realizar modificaciones.

Las API de back-end 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 configuración remota

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 mal formateadas. 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 configuración remota

Después de recuperar una plantilla y revisarla con las actualizaciones deseadas, puede 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 usar la API REST para volver a la versión anterior . Para mitigar el riesgo de errores en una actualización, puede validar antes de publicar .

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 aplicaciones o audiencias) debe existir en el proyecto de destino antes de la publicación.

    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 usuario que no existe en el proyecto de destino, la validación fallará.

  • Si la plantilla que planea publicar contiene condiciones que se basan en 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 la API .

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

Los proyectos de Firebase admiten cuentas de servicio de Google, que puede usar para llamar a las API del servidor de Firebase desde su servidor de aplicaciones o entorno de confianza. 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, abra Configuración > Cuentas de servicio .

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

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

Al autorizar 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 se recomienda encarecidamente.

Para establecer la variable de entorno:

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

Linux o mac OS

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 usar las credenciales de la cuenta de servicio cuando realiza pruebas o se ejecuta en entornos que no son de Google.

Use sus credenciales de Firebase junto con la biblioteca de autenticación de Google de su idioma preferido para recuperar un token de acceso de 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 de la 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

private 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 caduca su token de acceso, se llama automáticamente al método de actualización de 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 configuración remota

Cuando trabaje con plantillas de configuración remota, 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 control de versiones para obtener más información.

Obtenga la plantilla de configuración remota actual

Puede usar las API de back-end para obtener la versión activa actual de la plantilla de configuración remota 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 de JSON en un archivo y los encabezados (incluido el Etag) en un archivo separado.

Solicitud HTTP sin procesar

Host: firebaseremoteconfig.googleapis.com

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

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

Validar la plantilla de configuración remota

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 electrónica actualizada con el sufijo -0 significa 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.

Actualice la plantilla de configuración remota

Después de recuperar una plantilla y revisar el contenido JSON con las actualizaciones deseadas, puede 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 usar la API REST para volver a la versión anterior . Para mitigar el riesgo de errores en una actualización, puede validar antes de publicar .

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 aplicaciones o audiencias) debe existir en el proyecto de destino antes de la publicación.

    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 usuario que no existe en el proyecto de destino, la validación fallará.

  • Si la plantilla que planea publicar contiene condiciones que se basan en 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 usando el carácter "@", seguido del nombre del archivo.

Solicitud HTTP sin procesar

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 configuración remota

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 publicar la plantilla.

{
  "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; como los comentarios de código, estos son para uso del desarrollador y no se muestran en la aplicación. También se proporciona una ETag para fines de control de versiones.

Las API de back-end 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 Sentido
200 Actualizado exitosamente
400 Ocurrió 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 nueva y un valor de ETag, actualizar la plantilla y luego enviarla usando esa plantilla y el valor de ETag nuevo.
  • Se realizó un comando PUT (actualizar solicitud de plantilla de configuración remota) sin especificar un encabezado If-Match .
401 Ocurrió un error de autorización (no se proporcionó un token de acceso o la API REST de Firebase Remote Config no se agregó a su proyecto en Cloud Developer Console)
403 Ocurrió un error de autenticación (se proporcionó el token de acceso incorrecto)
500 Ha ocurrido un error interno. Si ocurre este error, presente un ticket de soporte de Firebase

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

Después de enviar actualizaciones a su plantilla, vaya a la consola de Firebase 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 como true tiene efecto).

Uso de ETag y actualizaciones forzadas

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

Para la API de REST, Google recomienda almacenar en caché el ETag proporcionado 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 da como resultado un código de estado HTTPS 409, debe emitir un nuevo comando GET 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, forzando 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 configuración remota. Este tipo de conflicto podría ocurrir con varios clientes que usan la API o con actualizaciones en conflicto de los clientes de la API y los usuarios de la consola de Firebase.

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