Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Remote Config güncellemelerini gerçek zamanlı olarak yayma

FCM ile birlikte Cloud Functions for Firebase tarafından sağlanan Remote Config arka plan işlevi tetiklemesini kullanarak Remote Config güncellemelerini gerçek zamanlı olarak yayabilirsiniz. Bu senaryoda, Remote Config şablonunuzu panodan veya API'den yayınladığınızda veya geri aldığınızda tetiklenen bir işlev oluşturursunuz. Şablon güncellemesi, istemcilere mevcut yapılandırmalarının eski olduğunu ve bir sonraki getirme işleminin sunucudan olması gerektiğini bildirmek için bir FCM mesajı gönderme işlevini tetikler:

Bu belgenin geri kalanı, Remote Config güncellemelerini gerçek zamanlı olarak yaymak için bu adımlarda size yol gösterir.

İstemci uygulama örneklerine bir FCM konusuna abone olun

Bir FCM mesajını, tüm kullanıcı tabanınız gibi geniş bir istemci uygulama örnekleri grubuna hedeflemek için konu mesajlaşması en etkili mekanizmadır. Gerçek zamanlı Remote Config güncellemelerini alması gereken her uygulama örneği, örneğin PUSH_RC gibi bir konu adına abone olmalıdır:

hızlı

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

Amaç-C

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

Android

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

Şablon güncellemelerinde FCM pingi göndermek için bir işlev oluşturun

Yeni bir yapılandırma sürümünün yayınlanması veya eski bir sürüme geri dönüş dahil olmak üzere Remote Config olaylarına yanıt olarak bir işlevi tetikleyebilirsiniz. Şablon güncellemelerini gerçek zamanlı olarak yaymak için şablon yayınlama olaylarını dinleyen bir işlev oluşturun ve ardından istemci uygulama örneklerine sessiz bir ping göndermek için işlevinizden FCM Yönetici SDK'sını kullanın:

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

Bu işlev bir CONFIG_STATE parametresi ayarlar ve ardından bunu PUSH_RC konusuna abone olan tüm istemcilere bir FCM mesajının veri yükü olarak gönderir.

İstemcide Remote Config durumunu ayarlayın

Önceki adımda gösterilen veri yükü, uygulamanın paylaşılan tercihlerinde her zaman CONFIG_STATE STALE olarak ayarlar. Bu, uygulamada zaten depolanan Remote Config şablonunun, yayını işlevi tetikleyen yeni, güncellenmiş şablonun oluşturulması nedeniyle artık eski olduğunu gösterir. Bu durumu test etmek için bildirim işleyicinizi güncelleyin:

hızlı

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

Amaç-C

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

Android

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

Uygulama başlangıcında Remote Config güncellemelerini alın

hızlı

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

Amaç-C

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

Android

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

Son olarak, CONFIG_STATE STALE olduğundan, ağdan bir Uzak Yapılandırma getirmeye zorlamak için (yerel depolamayı yok sayarak) uygulamanıza mantık ekleyin. Uygulamanız ağdan çok sık getiriliyorsa Firebase tarafından kısıtlanmış olabilir. Bkz. Kısma .