Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

שימוש בפונקצית רקע Config מרחוק מפעיל שמספק פונקציות ענן עבור Firebase יחד עם FCM , אתה יכול להפיץ מרחוק Config מעדכן בזמן אמת. בתרחיש זה, אתה יוצר פונקציה המפעילה בעת פרסום או החזרת תבנית התצורה מרחוק ממרכז השליטה או ממשק ה- API. עדכון התבנית מפעיל את הפונקציה לשלוח הודעת 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 Remote, כולל פרסום גרסת תצורה חדשה או החזרה לגירסה ישנה יותר. כדי להפיץ עדכוני תבניות בזמן אמת, צור פונקציה המאזינה לאירועי פרסום תבניות ולאחר מכן השתמש ב- SDM Admin FCM מהפונקציה שלך כדי לשלוח פינג שקט למופעי אפליקציית לקוח:

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 בהעדפות המשותפות של האפליקציה. זה מצביע על כך שהתבנית 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)
}
    

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. ראה ויסות .