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

Propagar actualizaciones de Remote Config en tiempo real

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Con la activación de la función en segundo plano de Remote Config proporcionada por Cloud Functions para Firebase junto con FCM , puede propagar las actualizaciones de Remote Config en tiempo real. En este escenario, crea una función que se activa cuando publica o revierte su plantilla de configuración remota desde el tablero o la API. La actualización de la plantilla activa la función para enviar un mensaje de FCM para que los clientes sepan que su configuración existente está obsoleta y que su próxima búsqueda debe ser del servidor:

Diagrama que muestra una actualización de Remote Config que activa alertas de FCM a través de Cloud Functions

El resto de este documento lo guía a través de estos pasos para propagar las actualizaciones de Remote Config en tiempo real.

Suscribir instancias de aplicaciones cliente a un tema de FCM

Para dirigir un mensaje de FCM a un gran grupo de instancias de aplicaciones cliente, como toda su base de usuarios, la mensajería de temas es el mecanismo más eficiente. Cada instancia de la aplicación que deba recibir actualizaciones de Remote Config en tiempo real debe suscribirse a un nombre de tema como, por ejemplo, PUSH_RC :

Rápido

extension AppDelegate : MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        messaging.subscribe(toTopic: "PUSH_RC") { error in
            print("Subscribed to PUSH_RC topic")
        }
    }
}
    

C objetivo

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    [[FIRMessaging messaging] subscribeToTopic:@"PUSH_RC" completion:^(NSError * _Nullable error) {
        NSLog(@"Subscribed to PUSH_RC topic");
    }];
}
    

Androide

@Override
public void onNewToken(String s) {
    FirebaseMessaging.getInstance().subscribeToTopic("PUSH_RC");
}
    

Cree una función para enviar un ping de FCM en actualizaciones de plantillas

Puede activar una función en respuesta a eventos de configuración remota, incluida la publicación de una nueva versión de configuración o la reversión a una versión anterior. Para propagar actualizaciones de plantillas en tiempo real, cree una función que escuche los eventos de publicación de plantillas y luego use el SDK de administrador de FCM de su función para enviar un ping silencioso a las instancias de la aplicación cliente:

exports.pushConfig = functions.remoteConfig.onUpdate(versionMetadata => {
  // Create FCM payload to send data message to PUSH_RC topic.
  const payload = {
    topic: "PUSH_RC",
    data: {
      "CONFIG_STATE": "STALE"
    }
  };
  // Use the Admin SDK to send the ping via FCM.
  return admin.messaging().send(payload).then(resp => {
    console.log(resp);
    return null;
  });
});

Esta función establece un parámetro CONFIG_STATE y luego lo envía como la carga de datos de un mensaje FCM a todos los clientes suscritos al tema PUSH_RC .

Establecer el estado de configuración remota en el cliente

La carga útil de datos que se muestra en el paso anterior siempre establece CONFIG_STATE en STALE en las preferencias compartidas de la aplicación. Esto indica que la plantilla de Remote Config ya almacenada en la aplicación ahora está obsoleta debido a la creación de la nueva plantilla actualizada cuya publicación activó la función. Actualice su controlador de notificaciones para probar esta condición:

Rápido

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    if (userInfo.index(forKey: "CONFIG_STATE") != nil) {
        print("Config set to stale")
        UserDefaults.standard.set(true, forKey:"CONFIG_STALE")
    }

    completionHandler(UIBackgroundFetchResult.newData)
}
    

C objetivo

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    if (userInfo[@"CONFIG_STATE"]) {
        NSLog(@"Config set to stale");
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CONFIG_STALE"];
    }

    completionHandler(UIBackgroundFetchResultNewData);
}
    

Androide

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getData().containsKey("CONFIG_STATE")) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        sharedPreferences.edit().putBoolean("CONFIG_STALE", true).apply();
    }
}
    

Obtener las actualizaciones de Remote Config al iniciar la aplicación

Rápido

func fetchConfig() {
  welcomeLabel.text = remoteConfig[loadingPhraseConfigKey].stringValue

  var expirationDuration = 3600
  // If your app is using developer mode, expirationDuration is set to 0, so each fetch will
  // retrieve values from the service.
  if remoteConfig.configSettings.isDeveloperModeEnabled || UserDefaults.standard.bool(forKey: "CONFIG_STALE") {
    expirationDuration = 0
  }

  remoteConfig.fetch(withExpirationDuration: TimeInterval(expirationDuration)) { (status, error) -> Void in
    if status == .success {
      print("Config fetched!")
      self.remoteConfig.activateFetched()
    } else {
      print("Config not fetched")
      print("Error: \(error?.localizedDescription ?? "No error available.")")
    }
    self.displayWelcome()
  }
}
    

C objetivo

- (void)fetchConfig {
    self.welcomeLabel.text = self.remoteConfig[kLoadingPhraseConfigKey].stringValue;

    long expirationDuration = 3600;
    // If your app is using developer mode, expirationDuration is set to 0, so each fetch will
    // retrieve values from the Remote Config service.
    if (self.remoteConfig.configSettings.isDeveloperModeEnabled || [[NSUserDefaults standardUserDefaults] boolForKey:@"CONFIG_STALE"]) {
        expirationDuration = 0;
    }

    [self.remoteConfig fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
        if (status == FIRRemoteConfigFetchStatusSuccess) {
            NSLog(@"Config fetched!");
            [self.remoteConfig activateFetched];
            [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CONFIG_STALE"];
        } else {
            NSLog(@"Config not fetched");
            NSLog(@"Error %@", error.localizedDescription);
        }
        [self displayWelcome];
    }];
}
    

Androide

private void fetchWelcomeMessage() {
    mWelcomeTextView.setText(mFirebaseRemoteConfig.getString("loading_phrase"));

    long cacheExpiration = 43200; // 12 hours in seconds.
    // If your app is using developer mode or cache is stale, cacheExpiration is set to 0,
    // so each fetch will retrieve values from the service.
    if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled() ||
            mSharedPreferences.getBoolean("CONFIG_STALE", false)) {
        cacheExpiration = 0;
    }

    mFirebaseRemoteConfig.fetch(cacheExpiration)
            .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Toast.makeText(MainActivity.this, "Fetch Succeeded",
                                Toast.LENGTH_SHORT).show();

                        // After config data is successfully fetched, it must be activated before newly fetched
                        // values are returned.
                        mFirebaseRemoteConfig.activateFetched();
                    } else {
                        Toast.makeText(MainActivity.this, "Fetch Failed",
                                Toast.LENGTH_SHORT).show();
                    }
                    mWelcomeTextView.setText(mFirebaseRemoteConfig.getString("welcome_message"));
                }
            });
}
    

Finalmente, agregue lógica a su aplicación para forzar una recuperación de configuración remota desde la red (ignorando el almacenamiento local) porque CONFIG_STATE está STALE . Si su aplicación se obtiene de la red con demasiada frecuencia, es posible que Firebase la limite. Consulte Limitación .