Catch up on everthing we announced at this year's Firebase Summit. Learn more

הפץ עדכוני תצורה מרחוק בזמן אמת

שימוש בפונקצית רקע Config מרחוק מפעיל שמספק פונקציות ענן עבור Firebase יחד עם FCM , אתה יכול להפיץ מרחוק Config מעדכן בזמן אמת. בתרחיש זה, אתה יוצר פונקציה המופעלת כאשר אתה מפרסם או מחזיר את תבנית התצורה המרוחקת שלך ממרכז השליטה או ה-API. עדכון התבנית מפעיל את הפונקציה לשלוח הודעת FCM כדי ליידע לקוחות שהתצורה הקיימת שלהם מיושן ושהשליפה הבאה שלהם צריכה להיות מהשרת:

תרשים המציג עדכון Config מרחוק המפעיל התראות FCM באמצעות פונקציות ענן

שאר המסמך הזה מנחה אותך בשלבים אלה כדי להפיץ עדכוני תצורה מרחוק בזמן אמת.

הירשם למופעי אפליקציה של לקוח לנושא FCM

למיקוד הודעת FCM לקבוצה גדולה של מופעי יישומי לקוח כמו כל בסיס המשתמשים שלך, העברת הודעות בנושא הוא המנגנון היעיל ביותר. כל מופע יישום שאמור לקבל בזמן אמת עדכונים Config מרחוק חייב להירשם שם נושא כמו, למשל, 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")
        }
    }
}
    

Objective-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 על עדכוני תבניות

אתה יכול להפעיל פונקציה בתגובה לאירועי 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 הנושא.

הגדר את מצב התצורה המרוחקת בלקוח

לוויין נתון המוצגים בשלב הקודם תמיד קובע CONFIG_STATE כדי STALE בהעדפות המשותפות של האפליקציה. זה מצביע על כך שתבנית התצורה המרוחקת שכבר מאוחסנת באפליקציה מעופשנת כעת עקב יצירת התבנית החדשה והמעודכנת שהפרסום שלה הפעיל את הפונקציה. עדכן את מטפל ההתראות שלך כדי לבדוק את המצב הזה:

מָהִיר

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

דְמוּי אָדָם

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

אחזר את עדכוני התצורה המרוחקת בעת הפעלת האפליקציה

מָהִיר

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

דְמוּי אָדָם

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

לבסוף, מוסיפים היגיון האפליקציה כדי לכפות Config מרחוק להביא מהרשת (התעלמות אחסון מקומי) כי CONFIG_STATE הוא STALE . אם האפליקציה שלך מאחזרת מהרשת בתדירות גבוהה מדי, היא עשויה להיות מונעת על ידי Firebase. ראה ויסות .