Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

以編程方式修改遠程配置

本文檔介紹了如何可以通過編程讀取和修改組被稱為JSON格式的參數和條件的遠程配置模板。這允許您在客戶端應用程序可以使用客戶端庫獲取的後端進行模板更改。

使用遠程配置REST API管理員的SDK本指南中所描述的,你可以繞過在火力地堡控制台管理模板中直接集成遠程配置變成你自己的過程。例如,使用遠程配置後端 API,您可以:

  • 調度遠程配置更新。通過將 API 調用與 cron 作業結合使用,您可以定期更改遠程配置值。
  • 批量導入配置值,以便從自己的專有系統到火力地堡遠程配置轉換效率。
  • 使用遠程配置與火力地堡雲功能的基礎上,這種情況發生服務器端事件改變你的應用價值。例如,您可以使用遠程配置來推廣應用中的新功能,然後在檢測到足夠多的人與新功能進行交互後自動關閉該推廣。

本指南的以下部分描述了您可以使用遠程配置後端 API 執行的操作。要查看通過 REST API 執行這些任務的一些代碼,請參閱以下示例應用程序之一:

使用 Firebase Admin SDK 修改遠程配置

Admin SDK 是一組服務器庫,可讓您從特權環境與 Firebase 交互。除了對遠程配置執行更新之外,Admin SDK 還支持生成和驗證 Firebase 身份驗證令牌、從實時數據庫讀取和寫入等。要了解更多有關管理SDK的先決條件和設置,請參閱添加火力地堡管理SDK到您的服務器

在典型的遠程配置流程中,您可能會獲取當前模板、修改某些參數或參數組和條件、驗證模板,然後發布它。在進行這些 API 調用之前,您必須授權來自 SDK 的請求。

初始化SDK並授權API請求

當你不帶參數初始化管理SDK,該SDK將使用谷歌應用程序的默認憑據和讀取選項FIREBASE_CONFIG環境變量。如果含量FIREBASE_CONFIG變量與開始{它會被解析為一個JSON對象。否則,SDK 假定字符串是包含選項的 JSON 文件的名稱。

例如:

節點.js

const admin = require('firebase-admin');
admin.initializeApp();

爪哇

FileInputStream serviceAccount = new FileInputStream("service-account.json");
FirebaseOptions options = FirebaseOptions.builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
FirebaseApp.initializeApp(options);

獲取當前的遠程配置模板

使用遠程配置模板時,請記住它們是版本化的,並且每個版本從創建到用更新替換它的時間都有有限的生命週期:90 天,總共限制 300 個存儲版本。見模板和版本以獲取更多信息。

您可以使用後端 API 以 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());

修改遠程配置參數

您可以以編程方式修改和添加遠程配置參數和參數組。例如,對於名為“new_menu”的現有參數組,您可以添加一個參數來控制季節性信息的顯示:

節點.js

function addParameterToGroup(template) {
  template.parameterGroups['new_menu'].parameters['spring_season'] = {
    defaultValue: {
      useInAppDefault: true
    },
    description: 'spring season menu visibility.',
  };
}

爪哇

template.getParameterGroups().get("new_menu").getParameters()
        .put("spring_season", new Parameter()
                .setDefaultValue(ParameterValue.inAppDefault())
                .setDescription("spring season menu visibility.")
        );

API 允許您創建新參數和參數組,或修改默認值、條件值和描述。在所有情況下,您都必須在修改後顯式發布模板。

修改遠程配置條件

您可以以編程方式修改和添加遠程配置條件和條件值。例如,要添加一個新條件:

節點.js

function addNewCondition(template) {
  template.conditions.push({
    name: 'android_en',
    expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']',
    tagColor: 'BLUE',
  });
}

爪哇

template.getConditions().add(new Condition("android_en",
        "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));

在所有情況下,您都必須在修改後顯式發布模板。

遠程配置後端 API 提供了多個條件和比較運算符,您可以使用它們來更改應用程序的行為和外觀。要了解更多有關條件和支持這些條件的經營者,看到條件表達式參考

驗證遠程配置模板

或者,您可以在發布之前驗證更新,如下所示:

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

此驗證過程會檢查錯誤,例如參數和條件的重複鍵、無效的條件名稱或不存在的條件,或格式錯誤的 etag。例如,包含超過的允許號碼的請求鍵-2000將返回錯誤信息, Param count too large

發布遠程配置模板

檢索模板並使用所需的更新對其進行修改後,您可以發布它。如本節所述發布模板會用更新的文件替換整個現有的配置模板,並且新的活動模板被分配一個比它替換的模板大一號的版本號。

如果必要的話,您可以使用REST API來回滾到以前的版本。為了減輕在更新錯誤的風險,你可以發布之前驗證

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

使用 REST API 修改遠程配置

本節將介紹在遠程配置REST API的主要功能https://firebaseremoteconfig.googleapis.com 。有關完整細節,請參見API參考

獲取訪問令牌以對 API 請求進行身份驗證和授權

火力地堡項目支持谷歌服務帳戶,您可以用它來從你的應用服務器或受信任的環境中調用火力地堡服務器API。如果您在本地開發代碼或在本地部署應用程序,則可以使用通過此服務帳戶獲得的憑據來授權服務器請求。

要對服務帳號進行身份驗證並授權其訪問 Firebase 服務,您必須生成一個 JSON 格式的私鑰文件。

要為您的服務帳戶生成私鑰文件:

  1. 在火力地堡控制台,打開設置>服務帳戶

  2. 點擊生成新的私鑰,然後點擊確認生成密鑰

  3. 安全地存儲包含密鑰的 JSON 文件。

通過服務帳戶進行授權時,您有兩種選擇來為您的應用程序提供憑據。您可以設置GOOGLE_APPLICATION_CREDENTIALS環境變量,也可以明確地傳遞的路徑,在代碼中的服務帳戶的關鍵。第一個選項更安全,強烈推薦。

要設置環境變量:

設置環境變量GOOGLE_APPLICATION_CREDENTIALS包含您的服務帳戶的關鍵JSON文件的文件路徑。此變量僅適用於您當前的 shell 會話,因此如果您打開一個新會話,請再次設置該變量。

Linux 或 macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

視窗

使用 PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

完成上述步驟後,應用程序默認憑據 (ADC) 能夠隱式確定您的憑據,從而允許您在非 Google 環境中測試或運行時使用服務帳戶憑據。

與使用您的火力地堡憑據一起谷歌驗證庫您的首選語言來獲取令牌短命的OAuth 2.0存取:

節點.js

 function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

在此示例中,Google API 客戶端庫使用 JSON Web 令牌或 JWT 對請求進行身份驗證。欲了解更多信息,請參閱JSON網絡令牌

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

爪哇

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

訪問令牌過期後,會自動調用令牌刷新方法以檢索更新的訪問令牌。

授權訪問遠程配置,請求範圍https://www.googleapis.com/auth/firebase.remoteconfig

修改遠程配置模板

使用遠程配置模板時,請記住它們是版本化的,並且每個版本從創建到用更新替換它的時間都有有限的生命週期:90 天,總共限制 300 個存儲版本。見模板和版本以獲取更多信息。

獲取當前的遠程配置模板

您可以使用後端 API 以 JSON 格式獲取遠程配置模板的當前活動版本。使用以下命令:

捲曲

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

此命令將 JSON 有效負載輸出到一個文件,並將標頭(包括 Etag)輸出到一個單獨的文件。

原始 HTTP 請求

Host: firebaseremoteconfig.googleapis.com

GET /v1/projects/my-project-id/remoteConfig HTTP/1.1
Authorization: Bearer token
Accept-Encoding: gzip

此API調用返回以下JSON,用一個單獨的頭,它包括一個沿著ETag的您用於後續請求。

驗證遠程配置模板

或者,您可以在發布更新之前對其進行驗證。通過附加到您的發布請求的URL參數驗證模板更新?validate_only=true 。在響應中,狀態代碼200,並帶有後綴的更新ETAG -0意味著您更新已成功驗證。任何非 200 響應都表示 JSON 數據包含您必須在發布前更正的錯誤。

更新遠程配置模板

檢索模板並使用所需的更新修改 JSON 內容後,您可以發布它。如本節所述發布模板會用更新的文件替換整個現有的配置模板,並且新的活動模板被分配一個比它替換的模板大一號的版本號。

如果必要的話,您可以使用REST API來回滾到以前的版本。為了減輕在更新錯誤的風險,你可以發布之前驗證

捲曲

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命令,您可以指定使用“@”字符,然後是文件名的內容。

原始 HTTP 請求

Host: firebaseremoteconfig.googleapis.com
PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1
Content-Length: size
Content-Type: application/json; UTF8
Authorization: Bearer token
If-Match: expected ETag
Accept-Encoding: gzip
JSON_HERE

因為這是一個寫請求, ETag的由該命令修改和更新的ETag的在下一的響應頭提供PUT命令。

修改遠程配置條件

您可以以編程方式修改遠程配置條件和條件值。使用 REST API,您必須在發布模板之前直接編輯模板以修改條件。

{
  "conditions": [{
    "name": "android_english",
    "expression": "device.os == 'android' && device.country in ['us', 'uk']",
    "tagColor": "BLUE"
  }, {
    "name": "tenPercent",
    "expression": "percent <= 10",
    "tagColor": "BROWN"
  }],
  "parameters": {
    "welcome_message": {
      "defaultValue": {
        "value": "Welcome to this sample app"
      },
      "conditionalValues": {
        "tenPercent": {
          "value": "Welcome to this new sample app"
        }
      },
      "description": "The sample app's welcome message"
    },
    "welcome_message_caps": {
      "defaultValue": {
        "value": "false"
      },
      "conditionalValues": {
        "android_english": {
          "value": "true"
        }
      },
      "description": "Whether the welcome message should be displayed in all capital letters."
    }
  }
}

修改上述的第一限定一組條件,然後限定了用於每個參數的缺省值和基於狀態的參數(條件值)值。它還為每個元素添加了一個可選的描述;像代碼註釋一樣,這些是供開發人員使用的,不會顯示在應用程序中。一個ETag的還提供了版本控制的目的。

遠程配置後端 API 提供了多個條件和比較運算符,您可以使用它們來更改應用程序的行為和外觀。要了解更多有關條件和支持這些條件的經營者,看到條件表達式參考

HTTP 錯誤代碼

狀態碼意義
200成功更新
400發生驗證錯誤。例如,包含超過的允許號碼的請求鍵-2000將返回400(錯誤請求)與所述錯誤消息, Param count too large 。此外,此 HTTPS 狀態代碼可能發生在以下兩種情況:
  • 發生版本不匹配錯誤,因為自上次檢索 ETag 值以來,該組值和條件已更新。為了解決這個問題,你應該使用GET命令來獲得一個新的模板和ETag值,更新模板,然後使用該模板和新鮮的ETag值提交。
  • PUT命令(更新遠程配置模板請求)而不指定作出If-Match標頭。
401發生授權錯誤(未提供訪問令牌或尚未在 Cloud Developer Console 中將 Firebase 遠程配置 REST API 添加到您的項目)
403發生身份驗證錯誤(提供了錯誤的訪問令牌)
500發生了內部錯誤。如果出現此錯誤,提交火力地堡支持票

狀態代碼 200 表示遠程配置模板(項目的參數、值和條件)已更新,現在可用於使用此項目的應用程序。其他狀態碼表示之前存在的遠程配置模板仍然有效。

提交模板更新後,請轉到 Firebase 控制台以驗證您的更改是否按預期顯示。這是至關重要的,因為條件的順序會影響它們是如何評估(即評估第一條件true生效)。

ETag 使用和強制更新

遠程配置 REST API 使用實體標籤 (ETag) 來防止競爭條件和資源的重疊更新。要了解更多有關的ETag,看到的ETag - HTTP

對於REST API,谷歌建議您緩存ETag的提供由最近的GET命令,並使用,在ETag值If-Match請求頭時發出PUT命令。如果PUT在HTTPS狀態代碼409命令的結果,你應該發出一個新的GET命令來獲得一個新的ETag和模板,使用您的下一個PUT命令。

您可以規避的ETag,並從它提供,通過強制遠程配置模板要更新的保護如下: If-Match: *但是,不建議使用此方法,因為它的風險導致的更新到你的遠程配置損失模板,如果多個客戶端正在更新遠程配置模板。使用 API 的多個客戶端或來自 API 客戶端和 Firebase 控制台用戶的衝突更新可能會發生這種衝突。

有關管理遠程配置模板版本的指導,請參閱遠程配置模板和版本