Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

프로그래밍 방식으로 원격 구성 수정

이 문서에서는 원격 구성 템플릿 이라고 하는 JSON 형식 매개변수 및 조건 세트를 프로그래밍 방식으로 읽고 수정할 수 있는 방법을 설명합니다. 이렇게 하면 클라이언트 앱이 클라이언트 라이브러리를 사용하여 가져올 수 있는 백엔드에서 템플릿을 변경할 수 있습니다.

이 가이드에 설명된 원격 구성 REST API 또는 Admin SDK 를 사용하면 Firebase 콘솔에서 템플릿 관리를 우회하여 원격 구성 변경 사항을 자체 프로세스에 직접 통합할 수 있습니다. 예를 들어 원격 구성 백엔드 API로 다음을 수행할 수 있습니다.

  • 원격 구성 업데이트 예약 . cron 작업과 함께 API 호출을 사용하여 정기적인 일정에 따라 원격 구성 값을 변경할 수 있습니다.
  • 자체 독점 시스템에서 Firebase 원격 구성으로 효율적으로 전환하기 위해 구성 값을 일괄 가져옵니다 .
  • Firebase용 Cloud Functions와 함께 원격 구성을 사용 하여 서버 측에서 발생하는 이벤트를 기반으로 앱의 값을 변경합니다. 예를 들어 원격 구성을 사용하여 앱의 새 기능을 홍보한 다음, 충분한 사람이 새 기능과 상호 작용한 것을 감지하면 해당 홍보를 자동으로 끌 수 있습니다.

    사용자 지정 도구 및 서버와 상호 작용하는 원격 구성 백엔드를 보여주는 다이어그램

이 가이드의 다음 섹션에서는 원격 구성 백엔드 API로 수행할 수 있는 작업에 대해 설명합니다. REST API를 통해 이러한 작업을 수행하는 일부 코드를 검토하려면 다음 샘플 앱 중 하나를 참조하십시오.

Firebase Admin SDK를 사용하여 원격 구성 수정

Admin SDK는 권한이 있는 환경에서 Firebase와 상호작용할 수 있는 서버 라이브러리 세트입니다. 원격 구성에 대한 업데이트를 수행하는 것 외에도 Admin SDK를 사용하면 Firebase 인증 토큰 생성 및 확인, 실시간 데이터베이스 읽기 및 쓰기 등을 수행할 수 있습니다. Admin SDK 전제 조건 및 설정에 대해 자세히 알아보려면 서버에 Firebase Admin SDK 추가를 참조하세요 .

일반적인 원격 구성 흐름에서는 현재 템플릿을 가져와서 일부 매개변수 또는 매개변수 그룹 및 조건을 수정하고 템플릿을 검증한 다음 게시할 수 있습니다. 이러한 API 호출을 수행하기 전에 SDK의 요청을 승인해야 합니다.

SDK 초기화 및 API 요청 승인

매개변수 없이 Admin SDK를 초기화하면 SDK는 Google 애플리케이션 기본 자격 증명 을 사용하고 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 형식으로 가져올 수 있습니다.

A/B Testing 실험에서 변형으로 특별히 생성된 매개변수 및 매개변수 값은 내보낸 템플릿에 포함되지 않습니다.

템플릿을 가져오려면:

노드.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를 사용 하여 이전 버전으로 롤백 할 수 있습니다. 업데이트의 오류 위험을 완화하기 위해 게시하기 전에 유효성을 검사 할 수 있습니다.

원격 구성 개인화 및 조건은 다운로드한 템플릿에 포함되어 있으므로 다른 프로젝트에 게시를 시도할 때 다음 제한 사항에 유의하는 것이 중요합니다.

  • 프로젝트 간에 개인화를 가져올 수 없습니다.

    예를 들어 프로젝트에서 개인 설정이 활성화되어 있고 템플릿을 다운로드하고 편집하는 경우 동일한 프로젝트에 게시할 수 있지만 템플릿에서 개인 설정을 삭제하지 않는 한 다른 프로젝트에 게시할 수 없습니다.

  • 프로젝트에서 프로젝트로 조건을 가져올 수 있지만 게시하기 전에 특정 조건부 값(예: 앱 ID 또는 대상)이 대상 프로젝트에 있어야 합니다.

    예를 들어 iOS 의 플랫폼 값을 지정하는 조건을 사용하는 원격 구성 매개변수가 있는 경우 플랫폼 값이 모든 프로젝트에서 동일하기 때문에 템플릿을 다른 프로젝트에 게시할 수 있습니다. 그러나 대상 프로젝트에 존재하지 않는 특정 앱 ID 또는 사용자 대상에 의존하는 조건이 포함된 경우 유효성 검사가 실패합니다.

  • 게시하려는 템플릿에 Google Analytics를 사용하는 조건이 포함된 경우 대상 프로젝트에서 Analytics를 활성화해야 합니다.

노드.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를 사용하여 원격 구성 수정

이 섹션에서는 https://firebaseremoteconfig.googleapis.com 에서 원격 구성 REST API의 주요 기능에 대해 설명합니다. 자세한 내용은 API 참조를 참조 하세요.

API 요청을 인증하고 승인하기 위한 액세스 토큰 가져오기

Firebase 프로젝트는 앱 서버 또는 신뢰할 수 있는 환경에서 Firebase 서버 API를 호출하는 데 사용할 수 있는 Google 서비스 계정 을 지원합니다. 로컬에서 코드를 개발하거나 애플리케이션을 온프레미스에 배포하는 경우 이 서비스 계정을 통해 얻은 자격 증명을 사용하여 서버 요청을 승인할 수 있습니다.

서비스 계정을 인증하고 Firebase 서비스에 액세스하도록 승인하려면 JSON 형식의 비공개 키 파일을 생성해야 합니다.

서비스 계정에 대한 개인 키 파일을 생성하려면:

  1. Firebase 콘솔에서 설정 > 서비스 계정 을 엽니다.

  2. 새 개인 키 생성 을 클릭한 다음 키 생성 을 클릭하여 확인합니다.

  3. 키가 포함된 JSON 파일을 안전하게 저장합니다.

서비스 계정을 통해 인증할 때 애플리케이션에 자격 증명을 제공하기 위한 두 가지 선택 사항이 있습니다. GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정하거나 코드에서 서비스 계정 키에 대한 경로를 명시적으로 전달할 수 있습니다. 첫 번째 옵션은 더 안전하며 강력히 권장됩니다.

환경 변수를 설정하려면:

환경 변수 GOOGLE_APPLICATION_CREDENTIALS 를 서비스 계정 키가 포함된 JSON 파일의 파일 경로로 설정합니다. 이 변수는 현재 쉘 세션에만 적용되므로 새 세션을 열면 변수를 다시 설정하십시오.

리눅스 또는 맥OS

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 이외의 환경에서 테스트하거나 실행할 때 서비스 계정 자격 증명을 사용할 수 있습니다.

원하는 언어의 Google 인증 라이브러리 와 함께 Firebase 자격 증명을 사용하여 단기 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 웹 토큰 또는 JWT를 사용하여 요청을 인증합니다. 자세한 내용은 JSON 웹 토큰 을 참조하십시오.

파이썬

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 형식으로 가져올 수 있습니다.

A/B Testing 실험에서 변형으로 특별히 생성된 매개변수 및 매개변수 값은 내보낸 템플릿에 포함되지 않습니다.

다음 명령을 사용합니다.

곱슬 곱슬하다

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 호출은 후속 요청에 사용하는 ETag 를 포함하는 별도의 헤더와 함께 다음 JSON을 반환합니다.

원격 구성 템플릿 확인

선택적으로 업데이트를 게시하기 전에 업데이트를 확인할 수 있습니다. 게시 요청에 URL 매개변수 ?validate_only=true 를 추가하여 템플릿 업데이트를 확인합니다. 응답에서 상태 코드 200과 접미사가 -0 인 업데이트된 etag는 업데이트가 성공적으로 검증되었음을 의미합니다. 200이 아닌 응답은 JSON 데이터에 게시하기 전에 수정해야 하는 오류가 포함되어 있음을 나타냅니다.

원격 구성 템플릿 업데이트

템플릿을 검색하고 원하는 업데이트로 JSON 콘텐츠를 수정했으면 게시할 수 있습니다. 이 섹션에 설명된 대로 템플릿을 게시하면 기존 구성 템플릿 전체가 업데이트된 파일로 교체되고 새 활성 템플릿에는 교체한 템플릿보다 한 번호 큰 버전 번호가 할당됩니다.

필요한 경우 REST API를 사용 하여 이전 버전으로 롤백 할 수 있습니다. 업데이트의 오류 위험을 완화하기 위해 게시하기 전에 유효성을 검사 할 수 있습니다.

원격 구성 개인화 및 조건은 다운로드한 템플릿에 포함되어 있으므로 다른 프로젝트에 게시를 시도할 때 다음 제한 사항에 유의하는 것이 중요합니다.

  • 프로젝트 간에 개인화를 가져올 수 없습니다.

    예를 들어 프로젝트에서 개인 설정이 활성화되어 있고 템플릿을 다운로드하고 편집하는 경우 동일한 프로젝트에 게시할 수 있지만 템플릿에서 개인 설정을 삭제하지 않는 한 다른 프로젝트에 게시할 수 없습니다.

  • 프로젝트에서 프로젝트로 조건을 가져올 수 있지만 게시하기 전에 특정 조건부 값(예: 앱 ID 또는 대상)이 대상 프로젝트에 있어야 합니다.

    예를 들어 iOS 의 플랫폼 값을 지정하는 조건을 사용하는 원격 구성 매개변수가 있는 경우 플랫폼 값이 모든 프로젝트에서 동일하기 때문에 템플릿을 다른 프로젝트에 게시할 수 있습니다. 그러나 대상 프로젝트에 존재하지 않는 특정 앱 ID 또는 사용자 대상에 의존하는 조건이 포함된 경우 유효성 검사가 실패합니다.

  • 게시하려는 템플릿에 Google Analytics를 사용하는 조건이 포함된 경우 대상 프로젝트에서 Analytics를 활성화해야 합니다.

곱슬 곱슬하다

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 명령의 응답 헤더에 업데이트된 ETag가 제공됩니다.

원격 구성 조건 수정

원격 구성 조건 및 조건부 값을 프로그래밍 방식으로 수정할 수 있습니다. 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개)보다 많은 키를 포함하는 요청은 오류 메시지 Param count too large 와 함께 400(잘못된 요청)을 반환합니다. 또한 이 HTTPS 상태 코드는 다음 두 가지 상황에서 발생할 수 있습니다.
  • ETag 값을 마지막으로 검색한 이후에 값 및 조건 세트가 업데이트되었기 때문에 버전 불일치 오류가 발생했습니다. 이 문제를 해결하려면 GET 명령을 사용하여 새 템플릿과 ETag 값을 가져오고 템플릿을 업데이트한 다음 해당 템플릿과 새 ETag 값을 사용하여 제출해야 합니다.
  • If-Match 헤더를 지정하지 않고 PUT 명령(원격 구성 템플릿 업데이트 요청)이 만들어졌습니다.
401 승인 오류가 발생했습니다(액세스 토큰이 제공되지 않았거나 Firebase 원격 구성 REST API가 Cloud Developer Console에서 프로젝트에 추가되지 않았습니다).
403 인증 오류가 발생했습니다(잘못된 액세스 토큰이 제공됨)
500 내부 오류가 발생했습니다. 이 오류가 발생 하면 Firebase 지원 티켓을 제출하세요.

상태 코드 200은 원격 구성 템플릿(프로젝트의 매개변수, 값 및 조건)이 업데이트되었으며 이제 이 프로젝트를 사용하는 앱에서 사용할 수 있음을 의미합니다. 다른 상태 코드는 이전에 존재했던 원격 구성 템플릿이 여전히 유효함을 나타냅니다.

템플릿 업데이트를 제출한 후 Firebase 콘솔로 이동하여 변경 사항이 예상대로 나타나는지 확인합니다. 이는 조건의 순서가 평가 방법에 영향을 미치기 때문에 중요합니다( true 를 평가하는 첫 번째 조건이 적용됨).

ETag 사용 및 강제 업데이트

원격 구성 REST API는 ETag(엔티티 태그)를 사용하여 리소스에 대한 경쟁 조건 및 중복 업데이트를 방지합니다. ETag에 대한 자세한 내용은 ETag - HTTP 를 참조하십시오.

REST API의 경우 가장 최근의 GET 명령에서 제공한 ETag를 캐시하고 PUT 명령을 실행할 때 If-Match 요청 헤더에서 해당 ETag 값을 사용하는 것이 좋습니다. PUT 명령 결과 HTTPS 상태 코드 409가 발생하면 새 GET 명령을 실행하여 다음 PUT 명령에 사용할 새 ETag 및 템플릿을 가져와야 합니다.

원격 구성 템플릿을 다음과 같이 강제로 업데이트하여 ETag 및 ETag가 제공하는 보호를 우회할 수 있습니다. If-Match: * 그러나 이 접근 방식은 원격 구성 업데이트가 손실될 위험이 있으므로 권장하지 않습니다. 여러 클라이언트가 원격 구성 템플릿을 업데이트하는 경우 템플릿. 이러한 종류의 충돌은 API를 사용하는 여러 클라이언트에서 또는 API 클라이언트 및 Firebase 콘솔 사용자의 업데이트가 충돌할 때 발생할 수 있습니다.

원격 구성 템플릿 버전 관리에 대한 지침은 원격 구성 템플릿 및 버전 관리 를 참조하십시오.