Check out what’s new from Firebase at Google I/O 2022. Learn more

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

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

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

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

הירשם למופעי אפליקציה של לקוח לנושא 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")
        }
    }
}
    

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_STATE הוא STALE . אם האפליקציה שלך מאחזרת מהרשת בתדירות גבוהה מדי, היא עשויה להיות מונעת על ידי Firebase. ראה מצערת .