Tuyên truyền cập nhật Cấu hình từ xa trong thời gian thực

Sử dụng chức năng nền Cấu hình từ xa được kích hoạt bởi Chức năng đám mây cho Firebase cùng với FCM , bạn có thể phổ biến các bản cập nhật Cấu hình từ xa trong thời gian thực. Trong trường hợp này, bạn tạo một hàm kích hoạt khi bạn xuất bản hoặc khôi phục mẫu Cấu hình từ xa của mình từ bảng điều khiển hoặc API. Bản cập nhật mẫu kích hoạt chức năng gửi thông báo FCM để cho khách hàng biết rằng cấu hình hiện có của họ đã cũ và lần tìm nạp tiếp theo phải từ máy chủ:

Sơ đồ hiển thị bản cập nhật Cấu hình từ xa kích hoạt cảnh báo FCM qua Chức năng đám mây

Phần còn lại của tài liệu này sẽ hướng dẫn bạn các bước sau để phổ biến các bản cập nhật Cấu hình từ xa trong thời gian thực.

Đăng ký các phiên bản ứng dụng khách cho một chủ đề FCM

Để nhắm mục tiêu thông báo FCM đến một nhóm lớn các phiên bản ứng dụng khách, chẳng hạn như toàn bộ cơ sở người dùng của bạn, nhắn tin theo chủ đề là cơ chế hiệu quả nhất. Mỗi phiên bản ứng dụng sẽ nhận được bản cập nhật Cấu hình từ xa theo thời gian thực phải đăng ký tên chủ đề, chẳng hạn như PUSH_RC :

Nhanh

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

Android

@Override
public void onNewToken(String s) {
    FirebaseMessaging.getInstance().subscribeToTopic("PUSH_RC");
}
    

Tạo chức năng gửi ping FCM khi cập nhật mẫu

Bạn có thể kích hoạt một chức năng để phản hồi các sự kiện Cấu hình từ xa, bao gồm việc xuất bản phiên bản cấu hình mới hoặc khôi phục về phiên bản cũ hơn. Để phổ biến các bản cập nhật mẫu trong thời gian thực, hãy tạo một hàm lắng nghe các sự kiện xuất bản mẫu, sau đó sử dụng SDK quản trị FCM từ chức năng của bạn để gửi một ping im lặng đến các phiên bản ứng dụng khách:

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

Hàm này đặt một tham số CONFIG_STATE , sau đó gửi tham số đó dưới dạng tải dữ liệu của một thông báo FCM đến tất cả các khách hàng đã đăng ký chủ đề PUSH_RC .

Đặt trạng thái Cấu hình từ xa trên máy khách

Tải trọng dữ liệu được hiển thị trong bước trước luôn đặt CONFIG_STATE thành STALE trong tùy chọn được chia sẻ của ứng dụng. Điều này chỉ ra rằng mẫu Cấu hình từ xa đã được lưu trữ trên ứng dụng hiện đã cũ do việc tạo mẫu mới, cập nhật mà việc xuất bản đã kích hoạt chức năng. Cập nhật trình xử lý thông báo của bạn để kiểm tra điều kiện này:

Nhanh

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

Android

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

Tìm nạp các bản cập nhật Cấu hình từ xa khi khởi động ứng dụng

Nhanh

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

Android

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

Cuối cùng, thêm logic vào ứng dụng của bạn để buộc tìm nạp Cấu hình từ xa từ mạng (bỏ qua bộ nhớ cục bộ) vì CONFIG_STATESTALE . Nếu ứng dụng của bạn tìm nạp từ mạng quá thường xuyên, thì ứng dụng đó có thể bị Firebase điều chỉnh. Xem Throttling .