获取我们在 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 天,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 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 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());
  }
}

休息

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

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 remoteconfig:rollback -v VERSION_NUMBER

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

下载和发布远程配置模板

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

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

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

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

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

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

  1. 下载当前的 Remote Config 配置模板
  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 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. 出现提示时,单击“浏览”,导航到并选择要发布的远程配置文件,然后单击“选择”。
  3. 该文件将被验证,如果成功,您可以单击发布以使配置立即对您的应用程序和用户可用。

远程配置个性化和条件包含在下载的模板中,因此在尝试发布到不同项目时了解以下限制很重要:

  • 无法将个性化从一个项目导入到另一个项目。

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

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

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

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

下载远程配置模板默认值

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

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

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

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

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

休息

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. Parameters选项卡中,打开 Menu ,然后选择Download default values
  2. 出现提示时,单击与您要下载的文件格式相对应的单选按钮,然后单击下载文件

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