Catch up on everything we announced at this year's Firebase Summit. Learn more

Remote Config 模板和版本控制

Remote Config 模板位于服务器端,是您为 Firebase 项目创建的一组 JSON 格式的参数和条件。在 Firebase 控制台的参数条件标签页中,您可以看到以图表形式显示的模板内容,并对该模板进行修改和管理。 您还可以使用 Remote Config 后端 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 或 Remote Config 后端 API 执行以下版本管理任务:

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

在管理 Remote Config 模板时,请注意以下过期限制:自创建之日起 90 天内有效;或存储的版本总数不得超过 300。如果您要存储或回滚超出上述限制的模板,请执行手动保存和存储。应用当前使用的活跃 Remote Config 模板不会过期;但是如果该模板自创建之日起活跃天数已超过 90 天,并且有新版模板取代了它,则该模板会因过期而无法再被检索到。

管理 Remote Config 模板版本

本部分介绍如何管理 Remote Config 模板版本。如需详细了解如何以编程方式创建、修改和保存模板,请参阅以编程方式修改 Remote Config

列出所有已存储的 Remote Config 模板版本

您可以检索所有已存储的 Remote Config 模板版本列表。例如:

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

Java

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

REST

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

Firebase 控制台

参数标签页中,选择右上角显示的时钟图标。这会打开更改历史记录页面,其右侧的列表菜单中列出了所有存储的模板版本。

每个存储版本显示的详细信息都包含更改来源的相关信息(源自控制台、REST API、回滚,还是来自强制保存模板的增量更改)。

Firebase CLI

firebase remoteconfig:versions:list

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

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

{
  "versions": [{
    "version_number": "6",
    "update_time": "2018-05-12T02:38:54Z",
    "update_user": {
      "email": "jane@developer.org",
    },
    "description": "One small change on the console",
    "origin": "CONSOLE",
    "update_type": "INCREMENTAL_UPDATE"
  }]

检索特定的 Remote Config 模板版本

您可以检索任何特定已存储的 Remote Config 模板版本。例如:

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

Java

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

REST

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</pre>

网址参数 ?version_number 仅对 GET 操作有效;您不能使用它为更新内容指定版本号。类似的 get 请求(但不包含 ?version_number 参数)会检索当前有效的模板。

Firebase 控制台

默认情况下,更改历史记录标签页中的“详细信息”窗格会显示当前活跃模板。如需查看列表中其他版本的详细信息,请从右侧菜单中将其选中。

您可以将鼠标悬停在任一未选版本的上下文菜单上并选择与选定版本进行比较,来查看当前所选版本与任何其他已存储版本之间的详细差异。

Firebase CLI

firebase remoteconfig:get -v VERSION_NUMBER

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

回滚到特定已存储版本的 Remote Config 模板

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

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

Java

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

REST

要回滚到已存储的 Remote Config 模板,请使用自定义方法 :rollback 发出一个 HTTP POST 请求,并在请求正文中指明要应用的具体版本。例如:

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

结果会包含当前活跃的已存储模板的内容,及其新版本的元数据。

Firebase 控制台

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

Firebase CLI

firebase remoteconfig:rollback -v VERSION_NUMBER

请注意,此回滚操作实际上会创建一个使用新版本号的版本。例如,从版本 10 回滚到版本 6 实际上会创建版本 6 的新副本,它与原版本(即版本 6)的唯一区别就是其版本号为 11。原来的版本 6 如果尚未到期,仍会存储在系统中。版本 11 会成为活跃版本。