本文件說明如何透過程式讀取 並修改 JSON 格式的參數和條件組合 (稱為 Remote Config範本。這樣一來,您就能在後端進行範本變更,讓用戶端應用程式可使用用戶端程式庫擷取範本。
您可以使用本指南所述的 Remote Config REST API 或 Admin SDK,略過在 Firebase 主控台中管理範本的程序,直接將 Remote Config 變更整合至您自己的程序。舉例來說 Remote Config 後端 API,您可以:
- 安排 Remote Config 項更新。將 API 呼叫與 Cron 工作搭配使用,您就可以定期變更 Remote Config 值。
- 批次匯入設定值,以便從自有專屬系統順利轉換至 Firebase Remote Config。
搭配使用 Remote Config 與 Cloud Functions for Firebase,根據在伺服器端發生的事件變更應用程式中的值。舉例來說,您可以使用 Remote Config 在應用程式中宣傳新功能,然後在偵測到有足夠人數與新功能互動時,自動關閉該宣傳活動。
本指南的以下章節說明您可以使用哪些作業 Remote Config 後端 API。如要查看透過 REST API 執行這些工作的程式碼,請參閱下列任一應用程式範例:
- Firebase 遠端設定 REST API Java 快速入門
- Firebase 遠端設定 REST API Node.js 快速入門
- Firebase 遠端設定 REST API Python 快速入門導覽課程
使用 Firebase Admin SDK 修改遠端設定
Admin SDK 是一組伺服器程式庫,可讓您與 從具有特殊權限的環境存取 Firebase。除了執行更新之外 至 Remote Config,Admin SDK 可用於產生及驗證 Firebase 驗證權杖、從 Realtime Database 讀取及寫入等。 如要進一步瞭解 Admin SDK 的先決條件和設定,請參閱「在伺服器中新增 Firebase Admin SDK」。
在典型的 Remote Config 流程中,您可能會取得目前的範本、修改部分參數或參數群組和條件、驗證範本,然後發布。進行這類 API 呼叫前,您必須先 從 SDK 發出請求
初始化 SDK 並授權 API 要求
當您使用無參數的 Admin SDK 進行初始化時,SDK 會使用 Google 應用程式預設憑證,並從 FIREBASE_CONFIG
環境變數讀取選項。如果 FIREBASE_CONFIG
變數的內容以 {
開頭,系統會將其剖析為 JSON 物件。否則 SDK 會假設該字串是含有選項的 JSON 檔案名稱。
例如:
Node.js
const admin = require('firebase-admin'); admin.initializeApp();
Java
FileInputStream serviceAccount = new FileInputStream("service-account.json"); FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options);
取得目前的遠端設定範本
使用 Remote Config 範本時,請注意這些範本會分成多個版本,且每個版本的生命週期有限,從建立時間到您用更新取代為止:90 天,且儲存的版本總數上限為 300 個。請參閱範本和版本管理 瞭解詳情
您可以使用後端 API 取得目前有效版本的 JSON 格式的「Remote Config」範本。
專為以下項目建立的參數和參數值: 匯出的範本不含 A/B Testing 項實驗。
如何取得範本:
Node.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); }); }
Java
Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get(); // See the ETag of the fetched template. System.out.println("ETag from server: " + template.getETag());
修改遠端設定參數
您可以以程式輔助的方式修改及新增 Remote Config 參數和參數群組。舉例來說,您可以為名為「new_menu」的現有參數群組新增參數,用來控制季節性資訊的顯示方式:
Node.js
function addParameterToGroup(template) { template.parameterGroups['new_menu'].parameters['spring_season'] = { defaultValue: { useInAppDefault: true }, description: 'spring season menu visibility.', }; }
Java
template.getParameterGroups().get("new_menu").getParameters() .put("spring_season", new Parameter() .setDefaultValue(ParameterValue.inAppDefault()) .setDescription("spring season menu visibility.") );
您可以使用 API 建立新的參數和參數群組,或修改預設值、條件值和說明。無論如何,您都必須在修改後明確發布範本。
修改遠端設定條件
您可以透過程式輔助方式修改及新增 Remote Config 條件和 條件式值。舉例來說,如要新增條件,請按照下列步驟操作:
Node.js
function addNewCondition(template) { template.conditions.push({ name: 'android_en', expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']', tagColor: 'BLUE', }); }
Java
template.getConditions().add(new Condition("android_en", "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));
無論如何,您都必須在修改後明確發布範本。
Remote Config 後端 API 提供多種條件和比較運算子,可用於變更應用程式的行為和外觀。如要進一步瞭解條件和這些條件支援的運算子,請參閱條件式運算式參考資料。
驗證遠端設定範本
您可以選擇在發布更新前先驗證,如下所示:
Node.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); }); }
Java
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 復原至先前版本。為降低更新內容出現錯誤的風險,您可以在發布前進行驗證。
已納入 Remote Config 項個人化設定和條件 下載範本,因此請務必留意下列事項 發布至其他專案的限制:
個人化資料無法從一個專案匯入另一個專案。
舉例來說,如果您在專案中啟用個人化功能,並下載及編輯範本,則可將範本發布至相同專案,但無法發布至其他專案,除非您從範本中刪除個人化功能。
條件可從專案匯入至專案,但請注意 特定條件值 (例如應用程式 ID 或目標對象) 應存在於 在發布前就先選取目標專案
舉例來說,如果您有一個 Remote Config 參數,其中使用指定
iOS
平台值的條件,則可將範本發布至其他專案,因為任何專案的平台值都相同。但是,如果條件需要使用特定應用程式 ID 或使用者, 如果目標對像不存在於目標專案中,驗證就會失敗。如果您要發布的範本包含依賴 Google Analytics 的條件,則必須在目標專案中啟用 Analytics。
Node.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); }); }
Java
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 修改遠端設定
本節將說明
Remote Config 個 REST API,位於 https://firebaseremoteconfig.googleapis.com
。
詳情請參閱 API 參考資料。
取得存取權杖,以便驗證及授權 API 要求
Firebase 專案支援 Google 服務帳戶 可用來呼叫 Firebase 伺服器 API。如果您正在開發 或在地端部署環境部署應用程式 您就能使用取得 透過這個服務帳戶授權伺服器要求
驗證及授權服務帳戶 您必須先產生 JSON 格式的私密金鑰檔案,才能存取 Firebase 服務 格式。
如何產生服務帳戶的私密金鑰檔案:
,瞭解如何調查及移除這項存取權。透過服務帳戶授權時,您有兩種方式可以提供 並將憑證傳送至您的應用程式您可以設定 GOOGLE_APPLICATION_CREDENTIALS 環境變數,或者也可以 在程式碼中明確傳送服務帳戶金鑰的路徑。 第一個選項較為安全,強烈建議您採用。
如何設定環境變數:
設定環境變數 GOOGLE_APPLICATION_CREDENTIALS 指向包含服務帳戶金鑰的 JSON 檔案路徑。 此變數僅適用於您目前的殼層工作階段,所以如果您開啟 新的工作階段,請再次設定變數。
Linux 或 macOS
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
Windows
使用 PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
完成上述步驟後,應用程式預設憑證 (ADC) 系統會以隱含方式判斷您的憑證,方便您使用 Service 在非 Google 環境中測試或執行時,就使用服務帳戶憑證
搭配使用 Firebase 憑證與 Google 驗證程式庫 ,以擷取慣用語言的 OAuth 2.0 存取權杖:
node.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 Token 或 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
Java
public static String getAccessToken() throws IOException {
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new FileInputStream("service-account.json"))
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refreshAccessToken();
return googleCredentials.getAccessToken().getTokenValue();
}
存取權杖到期後,系統會自動呼叫權杖重新整理方法,以便擷取更新的存取權杖。
如要授權存取 Remote Config,請要求範圍
https://www.googleapis.com/auth/firebase.remoteconfig
。
修改遠端設定範本
使用 Remote Config 範本時,請注意這些範本會分成多個版本,且每個版本的生命週期有限,從建立時間到您用更新取代為止:90 天,且儲存的版本總數上限為 300 個。請參閱範本和版本管理 瞭解詳情
取得目前的遠端設定範本
您可以使用後端 API 取得目前有效版本的 JSON 格式的「Remote Config」範本。
專為以下項目建立的參數和參數值: 匯出的範本不含 A/B Testing 項實驗。
請使用以下指令:
cURL
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 後續要求
驗證遠端設定範本
您可以選擇在發布更新前先驗證。透過附加的功能來驗證範本更新
網址參數:?validate_only=true
。
回應中為狀態碼 200,並已更新 etag,後方加上 -0
代表您的更新已順利完成驗證。任何非 200 的回應都表示 JSON 資料含有錯誤,您必須先修正這些錯誤,才能發布。
更新遠端設定範本
已擷取範本,並按照需求修改 JSON 內容 發布更新按照本節所述,發布範本會將整個現有設定範本替換為更新的檔案,而新有效範本會指派一個比所取代的範本高一個數字的版本號碼。
如有需要,您可以使用 REST API 復原至先前版本。 如要降低更新發生錯誤的風險,您可以 在發布前進行驗證。
Remote Config 下載的範本包含個人化設定和條件,因此嘗試將內容發布至其他專案時,請務必注意下列限制:
個人化資料無法從一個專案匯入另一個專案。
舉例來說,如果您在專案中啟用個人化功能,並下載及編輯範本,則可將範本發布至相同專案,但無法發布至其他專案,除非您從範本中刪除個人化功能。
條件可從專案匯入至專案,但請注意 特定條件值 (例如應用程式 ID 或目標對象) 應存在於 在發布前就先選取目標專案
舉例來說,如果您有一個 Remote Config 參數,其中使用指定
iOS
平台值的條件,則可將範本發布至其他專案,因為任何專案的平台值都相同。但是,如果條件需要使用特定應用程式 ID 或使用者, 如果目標對像不存在於目標專案中,驗證就會失敗。如果您要發布的範本包含依賴 Google Analytics 的條件,則必須在目標專案中啟用 Analytics。
cURL
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
已由這項指令修改,並在
下一個 PUT
指令的回應標頭。
修改遠端設定條件
您可以透過程式輔助,修改 Remote Config 條件和條件式 輕鬆分配獎金使用 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 為 但為了管控版本
Remote Config 後端 API 提供多項條件並比較 可用來變更應用程式行為和外觀的運算子。目的地: 進一步瞭解這些條件支援的運算子和 請參閱條件運算式參考資料。
HTTP 錯誤代碼
狀態碼 | 意義 |
---|---|
200 | 更新成功 |
400 | 發生驗證錯誤。舉例來說,如果要求包含的
允許的金鑰數量 (2000 個) 會與 300 個 (Bad Request) 傳回
錯誤訊息:Param count too large 。
此外,這類 HTTPS 狀態碼也可能出現在以下兩種情況:
|
401 | 發生授權錯誤 (未提供存取權杖或 Firebase Remote Config REST API 尚未新增至 Cloud Developer Console) |
403 | 發生驗證錯誤 (提供的存取權杖有誤) |
500 | 發生內部錯誤,如果發生這項錯誤 提交 Firebase 支援單 |
狀態碼 200 表示 Remote Config 範本 (參數、值) 條款及細則) 已更新,現已開放應用程式使用 使用這項專案的專案其他狀態碼表示 Remote Config 先前相同的範本仍會生效。
提交範本更新內容後,請前往 Firebase 控制台進行以下操作:
確認您的變更能正常顯示。這點非常重要,因為條件的順序會影響評估方式 (評估 true
的第一個條件會生效)。
ETag 用途和強制更新
Remote Config REST API 會使用實體標記 (ETag) 來預防競爭狀況 以及對資源進行重疊的更新如要進一步瞭解 ETag,請參閱「ETag - HTTP」。
針對 REST API,Google 建議您將最新 GET
指令提供的 ETag 快取,並在發出 PUT
指令時,在 If-Match
要求標頭中使用該 ETag 值。如果你的PUT
指令會產生 HTTPS 狀態碼 409,建議您發出最新的 GET
這個指令取得新的 ETag 和範本,並用於下一個 PUT
指令。
您可以強制更新 Remote Config 範本,如以下所示,藉此規避 ETag 和其提供的保護機制:If-Match: *
不過,如果有多個用戶端更新 Remote Config 範本,這種做法可能會導致您無法更新 Remote Config 範本,因此不建議採用。這類衝突可能與多個
或與 API 用戶端衝突的更新
Firebase 位控制台使用者。
如需管理 Remote Config 個範本版本的指引,請參閱 遠端設定範本和版本管理。