Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Remote Config güncellemelerini gerçek zamanlı olarak yayınlayın

Cloud Functions for Firebase tarafından FCM ile birlikte sağlanan Remote Config arka plan işlevini tetikleyerek, 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, istemcilerin mevcut yapılandırmalarının eski olduğunu ve sonraki getirmelerinin sunucudan olması gerektiğini bilmelerini sağlamak için bir FCM mesajı gönderme işlevi 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 örneklerini bir FCM konusuna abone olun

Bir FCM mesajını, tüm kullanıcı tabanınız gibi geniş bir istemci uygulama örneği grubuna hedeflemek için, konu mesajlaşma 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:

Swift

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 daha eski bir sürüme geri dönme 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 Admin SDK'yi 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 sonra 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 değerini 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:

Swift

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 getir

Swift

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 Remote Config getirmeye zorlamak için (yerel depolamayı göz ardı ederek) uygulamanıza mantık ekleyin. Uygulamanız ağdan çok sık alınıyorsa Firebase tarafından kısıtlanabilir. Kısma bakın.