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

遠程配置模板和版本控制

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

遠程配置模板是您為 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. 出現提示時,單擊與您要下載的文件格式對應的單選按鈕,然後單擊下載文件

有關將遠程配置默認值導入您的應用程序的更多信息,請參閱: