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

باستخدام وظيفة تشغيل خلفية Remote Config التي توفرها وظائف السحابة لـ Firebase جنبًا إلى جنب مع FCM ، يمكنك نشر تحديثات التكوين عن بُعد في الوقت الفعلي. في هذا السيناريو ، تقوم بإنشاء وظيفة يتم تشغيلها عند نشر قالب "التكوين البعيد" الخاص بك أو التراجع عنه من لوحة المعلومات أو واجهة برمجة التطبيقات. يؤدي تحديث القالب إلى تشغيل الوظيفة لإرسال رسالة FCM للسماح للعملاء بمعرفة أن التكوين الحالي الخاص بهم قديم وأن عملية الجلب التالية يجب أن تكون من الخادم:

رسم تخطيطي يوضح تحديث التكوين عن بُعد الذي يؤدي إلى تشغيل تنبيهات FCM عبر وظائف السحابة

يرشدك الجزء المتبقي من هذا المستند عبر هذه الخطوات لنشر تحديثات "التكوين عن بُعد" في الوقت الفعلي.

اشترك في طبعات تطبيق العميل في موضوع FCM

لاستهداف رسالة FCM إلى مجموعة كبيرة من طبعات تطبيق العميل مثل قاعدة المستخدمين بأكملها ، تعد المراسلة المواضيعية هي الآلية الأكثر فعالية. يجب أن يشترك كل مثيل تطبيق يجب أن يتلقى تحديثات Remote 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")
        }
    }
}
    

ج موضوعية

- (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 من وظيفتك لإرسال اختبار 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 .

قم بتعيين حالة 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)
}
    

ج موضوعية

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

أخيرًا ، أضف منطقًا إلى تطبيقك لفرض جلب التكوين عن بُعد من الشبكة (مع تجاهل التخزين المحلي) لأن CONFIG_STATE STALE . إذا كان تطبيقك يجلب من الشبكة كثيرًا جدًا ، فقد يتم تقييده بواسطة Firebase. انظر الخنق .