Dengan menggunakan pemicuan fungsi latar belakang Remote Config yang disediakan oleh Cloud Functions for Firebase bersama dengan FCM , Anda dapat menyebarkan pembaruan Remote Config secara real time. Dalam skenario ini, Anda membuat fungsi yang terpicu saat Anda memublikasikan atau mengembalikan template Remote Config dari dasbor atau API. Pembaruan template memicu fungsi untuk mengirim pesan FCM agar klien tahu bahwa konfigurasi yang ada sudah basi dan pengambilan berikutnya harus dari server:
Bagian selanjutnya dari dokumen ini memandu Anda melalui langkah-langkah ini untuk menyebarkan pembaruan Remote Config secara waktu nyata.
Berlangganan instance aplikasi klien ke topik FCM
Untuk menargetkan pesan FCM ke grup besar instance aplikasi klien seperti seluruh basis pengguna Anda, perpesanan topik adalah mekanisme yang paling efisien. Setiap instance aplikasi yang harus menerima pembaruan Remote Config realtime harus berlangganan nama topik seperti, misalnya, PUSH_RC
:
Cepat
extension AppDelegate : MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { messaging.subscribe(toTopic: "PUSH_RC") { error in print("Subscribed to PUSH_RC topic") } } }
Objective-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"); }
Buat fungsi untuk mengirim ping FCM pada pembaruan template
Anda dapat memicu fungsi sebagai respons terhadap peristiwa Remote Config, termasuk publikasi versi konfigurasi baru atau rollback ke versi lama. Untuk menyebarkan pembaruan template secara real time, buat fungsi yang memantau peristiwa publikasi template, lalu gunakan FCM Admin SDK dari fungsi Anda untuk mengirim silent ping ke instance aplikasi klien:
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; }); });
Fungsi ini menyetel parameter CONFIG_STATE
, lalu mengirimkannya sebagai muatan data dari pesan FCM ke semua klien yang berlangganan topik PUSH_RC
.
Setel status Remote Config pada klien
Payload data yang ditampilkan di langkah sebelumnya selalu menyetel CONFIG_STATE
ke STALE
di preferensi bersama aplikasi. Hal ini menunjukkan bahwa template Remote Config yang sudah disimpan di aplikasi sekarang sudah tidak berlaku karena pembuatan template baru yang diperbarui yang publikasinya memicu fungsi tersebut. Perbarui penangan notifikasi Anda untuk menguji kondisi ini:
Cepat
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) }
Objective-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(); } }
Ambil pembaruan Remote Config saat memulai aplikasi
Cepat
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() } }
Objective-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")); } }); }
Terakhir, tambahkan logika ke aplikasi Anda untuk memaksa pengambilan Remote Config dari jaringan (mengabaikan penyimpanan lokal) karena CONFIG_STATE
sudah STALE
. Jika aplikasi Anda terlalu sering mengambil dari jaringan, aplikasi mungkin akan dibatasi oleh Firebase. Lihat Pelambatan .