获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

远程配置模板和版本控制

远程配置模板是您为 Firebase 项目创建的一组服务器端 JSON 格式的参数和条件。您可以使用 Firebase 控制台修改和管理模板,该控制台在“参数”和“条件”选项卡中以图形格式显示模板的内容。您还可以使用远程配置后端 APIFirebase CLI来修改和管理您的配置。

下面是一个模板文件的例子:

  {
    "conditions": [
      {
        "name": "ios",
        "expression": "device.os == 'ios'"
      }
    ],
    "parameters": {
      "welcome_message": {
        "defaultValue": {
          "value": "Welcome to this sample app"
        },
        "conditionalValues": {
          "ios": {
            "value": "Welcome to this sample iOS app"
          }
        }
      },
      "welcome_message_caps": {
        "defaultValue": {
          "value": "false"
        }
      },
      "header_text": {
        "defaultValue": {
          "useInAppDefault": true
        }
      }
    },
    "version": {
      "versionNumber": "28",
      "updateTime": "2020-05-14T18:39:38.994Z",
      "updateUser": {
        "email": "user@google.com"
      },
      "updateOrigin": "CONSOLE",
      "updateType": "INCREMENTAL_UPDATE"
    }
  }

每次更新参数时,Remote Config 都会创建一个新版本的 Remote Config 模板,并将以前的模板存储为您可以根据需要检索或回滚到的版本。版本号从 Remote Config 存储的初始值开始按顺序递增。如图所示,所有模板都包含一个version字段,其中包含有关该特定版本的元数据。

使用 Firebase 控制台、Firebase CLI 或远程配置后端 API,您可以执行以下版本管理任务:

  • 列出所有存储的模板版本
  • 检索特定版本
  • 回滚到特定版本

在管理远程配置模板时,请牢记过期阈值:您的应用使用的当前活动远程配置模板不会过期;但是,如果它被更新替换,之前的版本将仅存储 90 天,之后它将过期并且无法检索。存储版本的总数也限制为 300 个。如果您想存储或回滚到超出这些限制的模板,请手动保存并存储它。

管理远程配置模板版本

本节介绍如何管理远程配置模板的版本。有关如何以编程方式创建、修改和保存模板的更多详细信息,请参阅以编程方式修改远程配置

列出远程配置模板的所有存储版本

您可以检索远程配置模板的所有存储版本的列表。例如:

节点.js

function listAllVersions() {
  admin.remoteConfig().listVersions()
    .then((listVersionsResult) => {
      console.log("Successfully fetched the list of versions");
      listVersionsResult.versions.forEach((version) => {
        console.log('version', JSON.stringify(version));
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

爪哇

ListVersionsPage page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
while (page != null) {
  for (Version version : page.getValues()) {
    System.out.println("Version: " + version.getVersionNumber());
  }
  page = page.getNextPage();
}

// Iterate through all versions. This will still retrieve versions in batches.
page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
for (Version version : page.iterateAll()) {
  System.out.println("Version: " + version.getVersionNumber());
}

休息

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

Firebase 控制台

在“参数”选项卡中,选择右上角显示的“时钟”图标。这将打开更改历史页面,在右侧的列表菜单中列出所有存储的模板版本。

为每个存储的版本显示的详细信息包括有关更改是否源自控制台、使用 REST API、来自回滚或者它们是否是来自强制保存模板的增量更改的信息。

Firebase 命令行界面

firebase remoteconfig:versions:list

使用--limit选项来限制返回的版本数。传递“0”以获取所有版本。

模板列表包括所有存储版本的元数据,包括更新时间、制作用户以及是通过控制台还是 REST API 制作的。下面是一个版本元素的例子:

{
  "versions": [{
    "version_number": "6",
    "update_time": "2022-05-12T02:38:54Z",
    "update_user": {
      "name": "Jane Smith",
      "email": "jane@developer.org",
      "imageUrl": "https://lh3.googleusercontent.com/a-/..."
    },
    "description": "One small change on the console",
    "origin": "CONSOLE",
    "update_type": "INCREMENTAL_UPDATE"
  }]

检索特定版本的远程配置模板

您可以检索远程配置模板的任何特定存储版本。例如:

节点.js

不带任何参数传递getTemplate()以检索模板的最新版本,或检索特定版本,使用getTemplateAtVersion()

// Get template version: 6
admin.remoteConfig().getTemplateAtVersion('6')
  .then((template) => {
    console.log("Successfully fetched the template with ETag: " + template.etag);
  })
  .catch((error) => {
    console.log(error);
  });

爪哇

Template template = FirebaseRemoteConfig.getInstance().getTemplateAtVersionAsync(versionNumber).get();
// See the ETag of the fetched template.
System.out.println("Successfully fetched the template with ETag: " + template.getETag());

休息

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig?version_number=6

URL 参数?version_number仅对GET操作有效;您不能使用它来指定更新的版本号。没有?version_number参数的类似获取请求将检索当前活动模板。

Firebase 控制台

默认情况下,更改历史选项卡中的详细信息窗格显示当前活动模板。要查看列表中另一个版本的详细信息,请从右侧菜单中选择它。

您可以通过将鼠标悬停在任何未选定版本的上下文菜单上并选择与选定版本比较来查看当前选定版本和任何其他存储版本的详细差异。

Firebase 命令行界面

firebase remoteconfig:get -v VERSION_NUMBER

或者,您可以使用-o, FILENAME将输出写入指定文件。

回滚到远程配置模板的特定存储版本

您可以回滚到模板的任何存储版本。例如:

节点.js

// Roll back to template version: 6
admin.remoteConfig().rollback('6')
  .then((template) => {
    console.log("Successfully rolled back to template version 6.");
    console.log("New ETag: " + template.etag);
  })
  .catch((error) => {
    console.log('Error trying to rollback:', e);
  })

爪哇

try {
  Template template = FirebaseRemoteConfig.getInstance().rollbackAsync(versionNumber).get();
  System.out.println("Successfully rolled back to template version: " + versionNumber);
  System.out.println("New ETag: " + template.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Error trying to rollback template.");
    System.out.println(rcError.getMessage());
  }
}

休息

要回滚到存储的远程配置模板,请使用自定义方法:rollback发出 HTTP POST,并在请求正文中使用要应用的特定版本。例如:

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -H "Content-Type: application/json" -X POST https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:rollback -d '{"version_number": 6}'

响应包含现在活动的存储模板的内容及其新版本元数据。

Firebase 控制台

对于符合回滚条件的先前模板版本,“更改历史记录”页面的右上角会显示一个用于回滚到该版本的选项按钮。仅当您确定要回滚到该版本并立即为所有应用程序和用户使用这些值时,才单击并确认。

Firebase 命令行界面

firebase remoteconfig:rollback -v VERSION_NUMBER

请注意,此回滚操作有效地创建了一个新的编号版本。例如,从版本 10 回滚到版本 6 有效地创建了版本 6 的新副本,与原始版本的不同之处仅在于其版本号为 11。原始版本 6 仍被存储,假设它尚未到期,并且版本 11 成为活动模板。

下载和发布远程配置模板

下载并发布远程配置模板,将它们集成到您的源代码控制和构建系统中,自动更新配置,并在多个项目中保持参数和值同步。

您可以通过编程方式或从 Firebase 控制台下载当前处于活动状态的远程配置模板。然后,您可以更新导出的 JSON 文件并将其发布到同一项目,或者将其发布到新项目或现有项目。

假设您有多个项目,它们代表软件开发生命周期的不同阶段,例如开发、测试、登台和生产环境。在这种情况下,您可以将经过全面测试的模板从您的暂存环境中提升到您的生产环境中,方法是从您的暂存项目中下载它并将其发布到您的生产项目中。

您还可以使用此方法将配置从一个项目迁移到另一个项目,或使用已建立项目的参数和值填充新项目。

在 A/B 测试实验中专门作为变体创建的参数和参数值不包含在导出的模板中。

要导出和导入远程配置模板:

  1. 下载当前的远程配置配置模板
  2. 验证远程配置模板
  3. 发布远程配置模板

下载当前的远程配置模板

您可以通过编程方式或使用 Firebase 控制台下载当前和活动的远程配置模板。

使用以下命令以 JSON 格式下载活动的远程配置模板:

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

休息

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

此命令将 JSON 有效负载输出到一个文件,并将标头(包括 ETag)输出到单独的headers文件。

Firebase 控制台

  1. 远程配置参数或条件选项卡中,打开菜单,然后选择下载当前配置文件
  2. 出现提示时,单击Download config file ,选择要保存文件的位置,然后单击Save

Firebase 命令行界面

firebase remoteconfig:get -o filename

验证远程配置模板

您可以在使用 Firebase Admin SDK 或 REST API 发布模板更新之前对其进行验证。当您尝试从 Firebase CLI 或 Firebase 控制台发布时,也会验证模板。

模板验证过程会检查错误,例如参数和条件的重复键、无效的条件名称或不存在的条件,或格式错误的 ETag。例如,包含超过允许的键数(2000)的请求将返回错误消息, Param count too large

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

休息

通过将 URL 参数?validate_only=true附加到您的发布请求来验证模板更新:

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?validate_only=true -d @filename

如果您的模板已成功验证,curl 命令会返回您提交的 JSON 模板,并且在保存的headers文件中,您将找到 HTTP/2 状态 200 和带有后缀-0的更新 ETag。如果您的模板未经过验证,您将在 JSON 响应中收到验证错误,并且您的headers文件将包含非 200 响应(并且没有 ETag)。

发布远程配置模板

下载模板、对 JSON 内容进行任何必要的更改并对其进行验证后,您可以将其发布到项目中。

发布模板会用更新的文件替换整个现有配置模板,并将模板版本增加一。由于整个配置被替换,如果您从 JSON 文件中删除一个参数并发布它,该参数将从服务器中删除并且不再可供客户端使用。

发布后,您的应用程序和用户可以立即使用对参数和值的更改。如有必要,您可以回滚到以前的版本

使用以下命令发布您的模板:

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

休息

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命令,您可以使用“@”字符后跟文件名来指定内容。

Firebase 控制台

  1. 远程配置参数或条件选项卡中,打开菜单,然后选择从文件发布
  2. 出现提示时,单击Browse ,导航到并选择要发布的 Remote Config 文件,然后单击Select
  3. 该文件将被验证,如果成功,您可以单击发布以使配置立即可供您的应用程序和用户使用。

远程配置个性化和条件包含在下载的模板中,因此在尝试发布到其他项目时,请务必注意以下限制:

  • 个性化不能从一个项目导入到另一个项目。

    例如,如果您在项目中启用了个性化并下载和编辑模板,则可以将其发布到同一个项目,但不能将其发布到不同的项目,除非您从模板中删除个性化。

  • 条件可以从一个项目导入到另一个项目,但请注意,任何特定的条件值(如应用 ID 或受众)在发布之前都应该存在于目标项目中。

    例如,如果您有一个 Remote Config 参数,该参数使用指定iOS平台值的条件,则可以将模板发布到另一个项目,因为任何项目的平台值都是相同的。但是,如果它包含依赖于特定应用 ID 或目标项目中不存在的用户受众的条件,则验证将失败。

  • 如果您计划发布的模板包含依赖 Google Analytics 的条件,则必须在目标项目中启用 Analytics。

下载远程配置模板默认值

由于您的应用程序可能并不总是连接到 Internet,因此您应该为所有远程配置参数配置客户端应用程序默认值。您还应该定期同步您的应用客户端默认值和远程配置后端默认参数值,因为它们可能会随着时间而改变。

如本节末尾特定于平台的链接中所述,您可以在应用程序中手动设置这些默认值,也可以通过下载包含所有参数的键值对及其默认值的文件来简化此过程活动的远程配置模板。然后,您可以将此文件包含在您的项目中并配置您的应用程序以导入这些值。

您可以为 Android 应用程序下载 XML 格式、iOS 应用程序的属性列表 (plist) 格式和 Web 应用程序的 JSON 格式的这些文件。

我们建议在发布任何新应用程序之前定期下载远程配置默认值,以确保您的应用程序和远程配置后端保持同步。

要下载包含模板默认值的文件:

休息

curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=file_format'

使用XMLPLISTJSON作为format值,具体取决于您要下载的文件格式。

Firebase 控制台

  1. 参数选项卡中,打开菜单,然后选择下载默认值
  2. 出现提示时,单击与您要下载的文件格式对应的单选按钮,然后单击下载文件

有关将远程配置默认值导入您的应用程序的更多信息,请参阅: