با استفاده از راهاندازی تابع پسزمینه Remote Config ارائه شده توسط Cloud Functions برای Firebase به همراه FCM ، میتوانید بهروزرسانیهای Remote Config را در زمان واقعی منتشر کنید. در این سناریو، تابعی ایجاد میکنید که وقتی الگوی Remote Config خود را از داشبورد یا API منتشر میکنید یا برمیگردانید، فعال میشود. بهروزرسانی الگو، عملکرد ارسال یک پیام FCM را فعال میکند تا به مشتریان اطلاع دهد که پیکربندی موجود آنها قدیمی است و واکشی بعدی آنها باید از سرور باشد:
بقیه این سند شما را از طریق این مراحل راهنمایی میکند تا بهروزرسانیهای Remote Config را در زمان واقعی منتشر کنید.
نمونه های برنامه مشتری را در یک موضوع FCM مشترک کنید
برای هدف قرار دادن یک پیام FCM به گروه بزرگی از نمونههای برنامه مشتری مانند کل پایگاه کاربر شما، پیامرسانی موضوع کارآمدترین مکانیسم است. هر نمونه برنامهای که باید بهروزرسانیهای پیکربندی از راه دور را دریافت کند، باید در نام موضوعی مشترک شود، مثلاً PUSH_RC
:
سریع
extension AppDelegate : MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { messaging.subscribe(toTopic: "PUSH_RC") { error in print("Subscribed to PUSH_RC topic") } } }
هدف-C
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken { [[FIRMessaging messaging] subscribeToTopic:@"PUSH_RC" completion:^(NSError * _Nullable error) { NSLog(@"Subscribed to PUSH_RC topic"); }]; }
اندروید
@Override public void onNewToken(String s) { FirebaseMessaging.getInstance().subscribeToTopic("PUSH_RC"); }
یک تابع برای ارسال پینگ FCM در به روز رسانی قالب ایجاد کنید
میتوانید عملکردی را در پاسخ به رویدادهای Remote Config، از جمله انتشار نسخه پیکربندی جدید یا بازگشت به نسخه قدیمیتر، فعال کنید. برای انتشار بهروزرسانیهای الگو در زمان واقعی، تابعی ایجاد کنید که به رویدادهای انتشار الگو گوش میدهد و سپس از FCM Admin SDK از تابع خود برای ارسال یک پینگ بیصدا به نمونههای برنامه مشتری استفاده کنید:
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; }); });
این تابع یک پارامتر CONFIG_STATE
را تنظیم می کند، و سپس آن را به عنوان بار داده یک پیام FCM برای همه مشتریان مشترک در موضوع PUSH_RC
ارسال می کند.
حالت Remote Config را روی کلاینت تنظیم کنید
محموله داده نشان داده شده در مرحله قبل همیشه CONFIG_STATE
را روی STALE
در تنظیمات برگزیده مشترک برنامه تنظیم می کند. این نشان میدهد که الگوی Remote Config که قبلاً در برنامه ذخیره شده بود، اکنون به دلیل ایجاد الگوی جدید و بهروزرسانی شده که انتشار آن عملکرد را فعال کرده است، قدیمی است. کنترل کننده اعلان خود را برای آزمایش این شرایط به روز کنید:
سریع
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
- (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); }
اندروید
@Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().containsKey("CONFIG_STATE")) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); sharedPreferences.edit().putBoolean("CONFIG_STALE", true).apply(); } }
بهروزرسانیهای Remote Config را هنگام راهاندازی برنامه واکشی کنید
سریع
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
- (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]; }]; }
اندروید
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")); } }); }
در نهایت، منطق را به برنامه خود اضافه کنید تا Remote Config از شبکه واکشی شود (بدون توجه به فضای ذخیره سازی محلی) زیرا CONFIG_STATE
STALE
است. اگر برنامه شما مکرراً از شبکه واکشی میشود، ممکن است Firebase آن را مهار کند. رجوع به تروتلینگ شود.