远程配置模板和版本控制

远程配置模板位于服务器端,是您为 Firebase 项目创建的一组 JSON 格式的参数和条件。在 Firebase 控制台的参数条件标签页中,您可以看到以图表形式显示的模板内容,并对该模板进行修改和管理。 您还可以使用远程配置后端 API 来修改和管理配置。

以下是模板文件的示例:

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

每当您更新参数时,远程配置都会创建一个新版的远程配置模板,并将旧模板存储为旧版本,供您在需要时检索或回滚到此版本。第一个版本号是远程配置存储的初始值,后面依序递增。如上图所示,所有模板中都有一个 version 字段,里面是相应版本的元数据。

借助 Firebase 控制台或程配置后端 API,您可以执行以下版本管理任务:

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

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

利用 Firebase 控制台管理远程配置模板的版本

Firebase 控制台提供了一个图形界面,您可以在此列出模板版本、查看模板详情和根据需要进行回滚。要执行上述任务,请按以下步骤操作:

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

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

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

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

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

使用后端 API 管理远程配置模板版本

本部分介绍如何使用 REST API 和 Firebase Admin SDK 管理远程配置模板的版本。如需详细了解如何以编程方式创建、修改和保存模板,请参阅以编程方式修改远程配置

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

使用远程配置后端 API,您可以检索远程配置模板的所有已存储版本的列表。例如:

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

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

结果会包含所有已存储版本的元数据,包括更新时间、进行更新的用户,以及更新是通过控制台还是 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"
  }]

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

借助远程配置后端 API,您可以检索远程配置模板的任何已存储版本。传递不带任何参数的 getTemplate() 可检索最新版本的模板。要检索特定版本,请使用 getTemplateAtVersion()。 例如:

Node.js

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

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 参数)会检索当前有效的模板。

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

借助远程配置后端 API,您可以回滚到模板的任何已存储版本。例如:

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

REST

要回滚到已存储的远程配置模板,请使用自定义方法 :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>

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

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