Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

نشر تحديثات التكوين عن بعد في الوقت الحقيقي

باستخدام وظيفة الخلفية للتكوين عن بعد التي توفرها وظائف السحاب لـ Firebase مع 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")
        }
    }
}
    

ج موضوعية

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

قم بإنشاء وظيفة لإرسال الأمر ping على تحديثات القالب

يمكنك تشغيل وظيفة استجابة لأحداث التكوين عن بُعد ، بما في ذلك نشر إصدار تكوين جديد أو التراجع إلى إصدار أقدم. لنشر تحديثات القالب في الوقت الحقيقي ، قم بإنشاء وظيفة تستمع إلى أحداث نشر القالب ، ثم استخدم FCM Admin SDK من وظيفتك لإرسال اختبار ping صامت إلى مثيلات تطبيق العميل:

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

ج موضوعية

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

ج موضوعية

- (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. انظر اختناق .