Firebase is back at Google I/O on May 10! Register now

به‌روزرسانی‌های پیکربندی از راه دور را در زمان واقعی منتشر کنید

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

با استفاده از راه‌اندازی تابع پس‌زمینه Remote Config ارائه شده توسط Cloud Functions برای Firebase به همراه FCM ، می‌توانید به‌روزرسانی‌های Remote Config را در زمان واقعی منتشر کنید. در این سناریو، تابعی ایجاد می‌کنید که وقتی الگوی Remote Config خود را از داشبورد یا API منتشر می‌کنید یا برمی‌گردانید، فعال می‌شود. به‌روزرسانی الگو، عملکرد ارسال یک پیام FCM را فعال می‌کند تا به مشتریان اطلاع دهد که پیکربندی موجود آنها قدیمی است و واکشی بعدی آنها باید از سرور باشد:

نموداری که به‌روزرسانی پیکربندی از راه دور را نشان می‌دهد که هشدارهای 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 آن را مهار کند. رجوع به تروتلینگ شود.