Programowa modyfikacja Zdalnej konfiguracji

W tym dokumencie opisano, w jaki sposób można programowo odczytywać i modyfikować zestaw parametrów i warunków w formacie JSON, znany jako szablon zdalnej konfiguracji . Umożliwia to wprowadzanie zmian w szablonach na zapleczu, które aplikacja kliencka może pobrać przy użyciu biblioteki klienta.

Korzystając z interfejsu API REST usługi Remote Config lub pakietów Admin SDK opisanych w tym przewodniku, możesz ominąć zarządzanie szablonem w konsoli Firebase i bezpośrednio zintegrować zmiany usługi Remote Config z własnymi procesami. Na przykład dzięki interfejsom API zaplecza usługi Remote Config można:

  • Planowanie aktualizacji zdalnej konfiguracji . Używając wywołań API w połączeniu z zadaniem cron, możesz regularnie zmieniać wartości Remote Config.
  • Zbiorczo importuj wartości konfiguracyjne , aby efektywnie przejść z własnego, zastrzeżonego systemu do Firebase Remote Config.
  • Użyj funkcji zdalnej konfiguracji z Cloud Functions dla Firebase , zmieniając wartości w aplikacji na podstawie zdarzeń zachodzących po stronie serwera. Możesz na przykład użyć Zdalnej konfiguracji, aby promować nową funkcję w swojej aplikacji, a następnie automatycznie wyłączyć tę promocję, gdy wykryje, że wystarczająca liczba osób weszła w interakcję z nową funkcją.

    Diagram przedstawiający interakcję zaplecza Remote Config z niestandardowymi narzędziami i serwerami

W poniższych sekcjach tego przewodnika opisano operacje, które można wykonać za pomocą interfejsów API zaplecza usługi Remote Config. Aby przejrzeć kod wykonujący te zadania za pośrednictwem interfejsu API REST, zapoznaj się z jedną z poniższych przykładowych aplikacji:

Zmodyfikuj zdalną konfigurację za pomocą pakietu Firebase Admin SDK

Admin SDK to zestaw bibliotek serwerowych, które umożliwiają interakcję z Firebase w uprzywilejowanych środowiskach. Oprócz wykonywania aktualizacji Remote Config, pakiet Admin SDK umożliwia generowanie i weryfikację tokenów autoryzacji Firebase, odczyt i zapis z bazy danych czasu rzeczywistego itd. Aby dowiedzieć się więcej o wymaganiach wstępnych i konfiguracji pakietu Admin SDK, zobacz Dodawanie pakietu Admin SDK Firebase do swojego serwera .

W typowym przepływie zdalnej konfiguracji możesz uzyskać bieżący szablon, zmodyfikować niektóre parametry lub grupy parametrów i warunki, sprawdzić poprawność szablonu, a następnie go opublikować. Przed wykonaniem tych wywołań API musisz autoryzować żądania z pakietu SDK.

Zainicjuj zestaw SDK i autoryzuj żądania API

Gdy inicjujesz pakiet Admin SDK bez parametrów, pakiet SDK korzysta z domyślnych danych uwierzytelniających aplikacji Google i odczytuje opcje ze zmiennej środowiskowej FIREBASE_CONFIG . Jeśli zawartość zmiennej FIREBASE_CONFIG zaczyna się od { , zostanie ona przeanalizowana jako obiekt JSON. W przeciwnym razie zestaw SDK zakłada, że ​​ciąg znaków jest nazwą pliku JSON zawierającego opcje.

Na przykład:

Node.js

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

Jawa

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

Pobierz aktualny szablon zdalnej konfiguracji

Pracując z szablonami Remote Config, należy pamiętać, że są one wersjonowane i że każda wersja ma ograniczony czas życia od momentu utworzenia do momentu zastąpienia jej aktualizacją: 90 dni, przy łącznym limicie przechowywanych wersji wynoszącym 300. Aby uzyskać więcej informacji, zobacz Szablony i wersjonowanie .

Możesz użyć interfejsów API zaplecza, aby uzyskać bieżącą aktywną wersję szablonu zdalnej konfiguracji w formacie JSON.

Parametry i wartości parametrów utworzone specjalnie jako warianty w eksperymencie testu A/B nie są uwzględniane w eksportowanych szablonach.

Aby uzyskać szablon:

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

Jawa

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

Zmodyfikuj parametry zdalnej konfiguracji

Można programowo modyfikować i dodawać parametry i grupy parametrów usługi Remote Config. Na przykład do istniejącej grupy parametrów o nazwie „nowe_menu” można dodać parametr sterujący wyświetlaniem informacji sezonowych:

Node.js

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

Jawa

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

Interfejs API umożliwia tworzenie nowych parametrów i grup parametrów lub modyfikowanie wartości domyślnych, wartości warunkowych i opisów. We wszystkich przypadkach po dokonaniu modyfikacji należy wyraźnie opublikować szablon.

Zmodyfikuj warunki zdalnej konfiguracji

Można programowo modyfikować i dodawać warunki i wartości warunkowe usługi Remote Config. Na przykład, aby dodać nowy warunek:

Node.js

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

Jawa

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

We wszystkich przypadkach po dokonaniu modyfikacji należy wyraźnie opublikować szablon.

Interfejsy API zaplecza usługi Remote Config udostępniają kilka warunków i operatorów porównania, których można użyć do zmiany zachowania i wyglądu aplikacji. Aby dowiedzieć się więcej o warunkach i operatorach obsługiwanych dla tych warunków, zobacz dokumentację wyrażeń warunkowych .

Sprawdź szablon zdalnej konfiguracji

Opcjonalnie możesz sprawdzić swoje aktualizacje przed ich opublikowaniem, jak pokazano:

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

Jawa

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

Ten proces sprawdzania poprawności sprawdza błędy, takie jak zduplikowane klucze parametrów i warunków, nieprawidłowe nazwy warunków lub nieistniejące warunki lub źle sformatowane etagi. Na przykład żądanie zawierające więcej niż dozwolona liczba kluczy — 2000 — zwróci komunikat o błędzie: Param count too large .

Opublikuj szablon zdalnej konfiguracji

Po pobraniu szablonu i poprawieniu go za pomocą żądanych aktualizacji można go następnie opublikować. Opublikowanie szablonu zgodnie z opisem w tej sekcji powoduje zastąpienie całego istniejącego szablonu konfiguracji zaktualizowanym plikiem, a nowemu aktywnemu szablonowi przypisany jest numer wersji o jeden większy niż szablon, który zastąpił.

W razie potrzeby możesz skorzystać z API REST, aby przywrócić poprzednią wersję . Aby zmniejszyć ryzyko błędów w aktualizacji, możesz sprawdzić poprawność przed publikacją .

Personalizacje i warunki Remote Config są zawarte w pobranych szablonach, dlatego przy próbie publikowania w innym projekcie należy pamiętać o następujących ograniczeniach:

  • Personalizacji nie można importować z projektu do projektu.

    Na przykład, jeśli w projekcie masz włączoną personalizację oraz pobrałeś i edytowałeś szablon, możesz opublikować go w tym samym projekcie, ale nie możesz opublikować go w innym projekcie, chyba że usuniesz personalizacje z szablonu.

  • Warunki można importować z projektu do projektu, ale należy pamiętać, że wszelkie określone wartości warunkowe (takie jak identyfikatory aplikacji lub odbiorcy) powinny istnieć w projekcie docelowym przed opublikowaniem.

    Na przykład, jeśli masz parametr Zdalnej konfiguracji, który używa warunku określającego wartość platformy iOS , szablon można opublikować w innym projekcie, ponieważ wartości platformy są takie same dla każdego projektu. Jeśli jednak zawiera warunek zależny od konkretnego identyfikatora aplikacji lub odbiorców użytkownika, którzy nie istnieją w projekcie docelowym, weryfikacja zakończy się niepowodzeniem.

  • Jeśli szablon, który planujesz opublikować, zawiera warunki bazujące na Google Analytics, Analytics musi być włączony w docelowym projekcie.

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

Jawa

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

Zmodyfikuj zdalną konfigurację za pomocą interfejsu API REST

W tej sekcji opisano główne możliwości interfejsu API REST Remote Config pod https://firebaseremoteconfig.googleapis.com . Aby uzyskać szczegółowe informacje, zobacz dokumentację API .

Zdobądź token dostępu, aby uwierzytelniać i autoryzować żądania API

Projekty Firebase obsługują konta usług Google, których możesz używać do wywoływania interfejsów API serwera Firebase z serwera aplikacji lub zaufanego środowiska. Jeśli tworzysz kod lokalnie lub wdrażasz aplikację lokalnie, możesz użyć poświadczeń uzyskanych za pośrednictwem tego konta usługi, aby autoryzować żądania serwera.

Aby uwierzytelnić konto usługi i autoryzować je do dostępu do usług Firebase, musisz wygenerować plik klucza prywatnego w formacie JSON.

Aby wygenerować plik klucza prywatnego dla swojego konta usługi:

  1. W konsoli Firebase otwórz Ustawienia > Konta usług .

  2. Kliknij opcję Wygeneruj nowy klucz prywatny , a następnie potwierdź, klikając opcję Wygeneruj klucz .

  3. Bezpiecznie przechowuj plik JSON zawierający klucz.

Podczas autoryzacji za pośrednictwem konta usługi masz dwie możliwości podania poświadczeń do aplikacji. Możesz ustawić zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS lub jawnie przekazać ścieżkę do klucza konta usługi w kodzie. Pierwsza opcja jest bezpieczniejsza i zdecydowanie zalecana.

Aby ustawić zmienną środowiskową:

Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na ścieżkę pliku JSON zawierającego klucz konta usługi. Ta zmienna dotyczy tylko bieżącej sesji powłoki, więc jeśli otworzysz nową sesję, ustaw zmienną ponownie.

Linux lub macOS

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

Okna

Z PowerShellem:

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

Po wykonaniu powyższych kroków domyślne dane uwierzytelniające aplikacji (ADC) mogą niejawnie określić Twoje dane uwierzytelniające, umożliwiając korzystanie z danych uwierzytelniających konta usługi podczas testowania lub uruchamiania w środowiskach innych niż Google.

Użyj danych uwierzytelniających Firebase razem z biblioteką Google Auth dla preferowanego języka, aby pobrać krótkotrwały token dostępu OAuth 2.0:

węzeł.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);
      });
}

W tym przykładzie biblioteka klienta API Google uwierzytelnia żądanie za pomocą tokena sieciowego JSON, czyli JWT. Aby uzyskać więcej informacji, zobacz tokeny internetowe JSON .

Pyton

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

Jawa

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

Po wygaśnięciu tokenu dostępu metoda odświeżania tokenu jest wywoływana automatycznie w celu pobrania zaktualizowanego tokenu dostępu.

Aby autoryzować dostęp do Remote Config, poproś o zakres https://www.googleapis.com/auth/firebase.remoteconfig .

Zmodyfikuj szablon zdalnej konfiguracji

Pracując z szablonami Remote Config, należy pamiętać, że są one wersjonowane i że każda wersja ma ograniczony czas życia od momentu utworzenia do momentu zastąpienia jej aktualizacją: 90 dni, przy łącznym limicie przechowywanych wersji wynoszącym 300. Aby uzyskać więcej informacji, zobacz Szablony i wersjonowanie .

Pobierz aktualny szablon zdalnej konfiguracji

Możesz użyć interfejsów API zaplecza, aby uzyskać bieżącą aktywną wersję szablonu zdalnej konfiguracji w formacie JSON.

Parametry i wartości parametrów utworzone specjalnie jako warianty w eksperymencie testu A/B nie są uwzględniane w eksportowanych szablonach.

Użyj następujących poleceń:

kędzior

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

To polecenie wysyła ładunek JSON do jednego pliku, a nagłówki (w tym Etag) do osobnego pliku.

Surowe żądanie HTTP

Host: firebaseremoteconfig.googleapis.com

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

To wywołanie interfejsu API zwraca następujący kod JSON wraz z oddzielnym nagłówkiem zawierającym znacznik ETag używany w kolejnym żądaniu.

Sprawdź szablon zdalnej konfiguracji

Opcjonalnie możesz sprawdzić poprawność aktualizacji przed ich opublikowaniem. Sprawdź aktualizacje szablonu, dołączając do żądania publikacji parametr adresu URL ?validate_only=true . W odpowiedzi kod stanu 200 i zaktualizowany etag z przyrostkiem -0 oznaczają, że aktualizacja została pomyślnie sprawdzona. Każda odpowiedź inna niż 200 wskazuje, że dane JSON zawierają błędy, które należy poprawić przed publikacją.

Zaktualizuj szablon zdalnej konfiguracji

Po pobraniu szablonu i poprawieniu zawartości JSON za pomocą żądanych aktualizacji możesz go następnie opublikować. Opublikowanie szablonu zgodnie z opisem w tej sekcji powoduje zastąpienie całego istniejącego szablonu konfiguracji zaktualizowanym plikiem, a nowemu aktywnemu szablonowi przypisany jest numer wersji o jeden większy niż szablon, który zastąpił.

W razie potrzeby możesz skorzystać z API REST, aby przywrócić poprzednią wersję . Aby zmniejszyć ryzyko błędów w aktualizacji, możesz sprawdzić poprawność przed publikacją .

Personalizacje i warunki Remote Config są zawarte w pobranych szablonach, dlatego przy próbie publikowania w innym projekcie należy pamiętać o następujących ograniczeniach:

  • Personalizacji nie można importować z projektu do projektu.

    Na przykład, jeśli w projekcie masz włączoną personalizację oraz pobrałeś i edytowałeś szablon, możesz opublikować go w tym samym projekcie, ale nie możesz opublikować go w innym projekcie, chyba że usuniesz personalizacje z szablonu.

  • Warunki można importować z projektu do projektu, ale należy pamiętać, że wszelkie określone wartości warunkowe (takie jak identyfikatory aplikacji lub odbiorcy) powinny istnieć w projekcie docelowym przed opublikowaniem.

    Na przykład, jeśli masz parametr Zdalnej konfiguracji, który używa warunku określającego wartość platformy iOS , szablon można opublikować w innym projekcie, ponieważ wartości platformy są takie same dla każdego projektu. Jeśli jednak zawiera warunek zależny od konkretnego identyfikatora aplikacji lub odbiorców użytkownika, którzy nie istnieją w projekcie docelowym, weryfikacja zakończy się niepowodzeniem.

  • Jeśli szablon, który planujesz opublikować, zawiera warunki bazujące na Google Analytics, Analytics musi być włączony w docelowym projekcie.

kędzior

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

W przypadku tego polecenia curl możesz określić treść, używając znaku „@”, po którym następuje nazwa pliku.

Surowe żądanie 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

Ponieważ jest to żądanie zapisu, ETag jest modyfikowany przez to polecenie, a zaktualizowany ETag jest dostarczany w nagłówkach odpowiedzi następnego polecenia PUT .

Zmodyfikuj warunki zdalnej konfiguracji

Można programowo modyfikować warunki i wartości warunkowe usługi Remote Config. Dzięki interfejsowi API REST musisz bezpośrednio edytować szablon, aby zmodyfikować warunki przed opublikowaniem szablonu.

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

Powyższe modyfikacje najpierw definiują zestaw warunków, a następnie definiują wartości domyślne i wartości parametrów oparte na warunkach ( wartości warunkowe ) dla każdego parametru. Dodaje także opcjonalny opis każdego elementu; podobnie jak komentarze do kodu, są one przeznaczone do użytku programistów i nie są wyświetlane w aplikacji. ETag jest również udostępniany do celów kontroli wersji.

Interfejsy API zaplecza usługi Remote Config udostępniają kilka warunków i operatorów porównania, których można użyć do zmiany zachowania i wyglądu aplikacji. Aby dowiedzieć się więcej o warunkach i operatorach obsługiwanych dla tych warunków, zobacz dokumentację wyrażeń warunkowych .

Kody błędów HTTP

Kod statusu Oznaczający
200 Pomyślnie zaktualizowano
400 Wystąpił błąd sprawdzania poprawności. Na przykład żądanie zawierające więcej niż dozwolona liczba kluczy — 2000 — zwróci 400 (złe żądanie) z komunikatem o błędzie Param count too large . Ponadto ten kod stanu HTTPS może wystąpić w następujących dwóch sytuacjach:
  • Wystąpił błąd niezgodności wersji, ponieważ zestaw wartości i warunków został zaktualizowany od czasu ostatniego pobrania wartości ETag. Aby rozwiązać ten problem, należy użyć polecenia GET w celu pobrania nowego szablonu i wartości ETag, zaktualizować szablon, a następnie przesłać przy użyciu tego szablonu i nowej wartości ETag.
  • Wykonano polecenie PUT (żądanie szablonu aktualizacji zdalnej konfiguracji) bez określenia nagłówka If-Match .
401 Wystąpił błąd autoryzacji (nie podano tokena dostępu lub interfejs API REST Firebase Remote Config nie został dodany do Twojego projektu w Cloud Developer Console)
403 Wystąpił błąd uwierzytelnienia (podano nieprawidłowy token dostępu)
500 Wystąpił błąd wewnętrzny. Jeśli wystąpi ten błąd, złóż zgłoszenie do pomocy technicznej Firebase

Kod stanu 200 oznacza, że ​​szablon Remote Config (parametry, wartości i warunki projektu) został zaktualizowany i jest teraz dostępny dla aplikacji korzystających z tego projektu. Inne kody stanu wskazują, że szablon zdalnej konfiguracji, który istniał wcześniej, nadal obowiązuje.

Po przesłaniu aktualizacji szablonu przejdź do konsoli Firebase, aby sprawdzić, czy zmiany wyglądają zgodnie z oczekiwaniami. Ma to kluczowe znaczenie, ponieważ kolejność warunków wpływa na sposób ich oceny (zaczyna obowiązywać pierwszy warunek, który ocenia wartość true ).

Użycie ETag i wymuszone aktualizacje

Interfejs API REST usługi Remote Config korzysta ze znacznika encji (ETag), aby zapobiegać warunkom wyścigowym i nakładającym się aktualizacjom zasobów. Aby dowiedzieć się więcej na temat ETagów, zobacz ETag — HTTP .

W przypadku interfejsu API REST firma Google zaleca buforowanie elementu ETag dostarczonego przez najnowsze polecenie GET i używanie tej wartości ETag w nagłówku żądania If-Match podczas wydawania poleceń PUT . Jeśli polecenie PUT zwróci kod stanu HTTPS 409, należy wydać nowe polecenie GET , aby uzyskać nowy znacznik ETag i szablon do użycia z następnym poleceniem PUT .

Można ominąć ETag i zapewnianą przez niego ochronę, wymuszając aktualizację szablonu Zdalnej konfiguracji w następujący sposób: If-Match: * Jednak to podejście nie jest zalecane, ponieważ stwarza ryzyko utraty aktualizacji Zdalnej konfiguracji szablon, jeśli wielu klientów aktualizuje szablon Zdalnej konfiguracji. Ten rodzaj konfliktu może wystąpić w przypadku wielu klientów korzystających z interfejsu API lub w przypadku sprzecznych aktualizacji od klientów API i użytkowników konsoli Firebase.

Aby uzyskać wskazówki dotyczące zarządzania wersjami szablonów Remote Config, zobacz Szablony i przechowywanie wersji Remote Config .